【问题标题】:How do I put two spaces after every period in our HTML?如何在 HTML 中的每个句点后放置两个空格?
【发布时间】:2011-12-03 04:06:58
【问题描述】:

我需要在我们整个网站的每个句子的每个句点之后有两个空格(不要问)。

一种方法是在每个周期之后手动添加一个&nbsp 。这需要几个小时。

我们不能只查找和替换每个句点,因为我们在 PHP 和其他情况下有连接,其中有句点,然后是空格,但它不在一个句子中。

有没有办法做到这一点...并且一切仍然在 Internet Explorer 6 中运行?

[编辑] - 棘手的部分是,在代码中,有几行 PHP 包含带有空格的点,如下所示:

<?php echo site_url('/css/' . $some_name .'.css');?>

我绝对不希望额外的空格来打破这样的行,所以我很乐意在每个句点之后添加两个可见空格在所有 P 标记中

【问题讨论】:

  • 除了 PHP 和 Javascript 上下文,还有省略号(三个点),每个点之后可能不需要空格。
  • 不,没有,你不应该一开始就尝试。 (如果目标是准确地复制文档,那么 HTML 是错误的工具,如果不是,那么您不应该尝试使用过时的印刷约定)。
  • @stivlo — 这应该不是问题,因为如果有人想要省略号,那么他们会使用省略号 () 而不是三个句号 (...),对吗? (不,可能不是,叹息)。
  • 这是我提倡打好仗的地方,并告诉他们 whitespace+ 被压缩为 HTML 中的空白是有充分理由的,并且在句号之后的双空格的做法应该随着比例字体的发明。
  • Quentin,省略号是拉丁文 1 的遗留字符。它并不完全需要,并且会剥夺排字机对间距的控制。

标签: html spaces


【解决方案1】:

根据文本的范围,您也许可以使用 JavaScript 拆分方法或正则表达式。

分割方法如下:

var el = document.getElementById("mydiv");
if (el){
    el.innerText = el.innerText.split(".").join(".\xA0 ");   
}

测试用例:

Hello world。在句号后插入空格。使用拆分方法。

结果:

你好,世界。在句点后插入空格。使用拆分方法。

【讨论】:

  • 编辑了我的答案。你是这个意思吗?
【解决方案2】:

如果您不反对“后处理”/“javascript”解决方案:

var nodes = $('*').contents().map(function(a, b) {
    return (b.nodeType === Node.TEXT_NODE ? b : null);
});
$.each(nodes, function(i,node){
    node.data = node.data.replace(/(\.\s)/g, '.\u00A0\u00A0');
});

为了简洁起见使用 jQuery,但不是必需的。

附言我看到您关于并非所有时期和空间都应该被平等对待的评论,但这已经是最好的了。否则,您将需要更好/更防弹的方法。

【讨论】:

  • 这将防止句子后换行。最好改用U+00A0 U+0020
【解决方案3】:

您是否考虑过使用输出缓冲区? ob_start($callback)

未测试,但如果您将在任何输出之前粘贴此功能(或更好,请卸载该功能):

<?php
    function processDots($buffer)
    {
      return (str_replace(".", ".&nbsp;", $buffer));
    }

    ob_start("processDots");
?>

并将其添加到输入的末尾:

<?php ob_end_flush(); ?>

可能只是工作:)

【讨论】:

  • 现在它是一个点和一个空格,这显然不是解决方案,而是一个可以继续发展的想法。
  • 我认为你应该只替换 . 后跟一个空格。由于其他.s 通常不会结束一个句子。
【解决方案4】:

众所周知,HTML 会折叠空白,但它只是为了显示。额外的空间仍然存在。因此,如果在每个句点之后使用两个空格创建源材料,那么可以使建议的这些替换方法中的一些可靠地工作 - 搜索“句点-空间-空间”并将其替换为更合适的内容,例如句点-空间-&emsp14;。请注意,您不应该使用  因为它可以防止在边距处正确换行。 (如果您使用的是不规则右边,只要您在空格前使用 nbsp,边距变化就不会很明显。)

您还可以将每个句子包装在一个跨度中,并使用 :after 选择器添加一个空格并使用“word-spacing”将其格式化为宽。或者您可以直接将句子之间的空间包裹在一个跨度和样式中。

我为博主编写了一个 javascript 解决方案,它可以即时执行此操作,查找 period-space-space,并将其替换为看起来更宽的跨越式、样式化的空间。

但是,如果您的原始材料不包含这类东西,那么您将不得不研究句子边界检测算法(这不是那么简单),然后修改一个也不会绊倒 PHP 代码。

【讨论】:

  • 在开发剧本共享 php/html/js 应用程序时搜索此答案。并对这条评论竖起大拇指 - &emsp14;是要走的路。无论出于何种原因,剧本继续使用等宽字体,比如 courier。制作部门说一页=一分钟的屏幕时间。或者也许只是因为他们已经习惯了。谁知道?无论如何,它正在被使用,所以我要感谢那些真正回答这个问题的人。对于那些反对首先提出问题的人,我幸运地达到了我的字数限制,所以不能说什么。
【解决方案5】:

将这样的内容合并到您的 PHP 文件中:

<?php if (preg_match('/^. [A-Z]$/' || '/^.  [A-Z]$/')) { preg_replace('. ', '.&nbsp; '); } ?>

这允许您搜索每个新句子的开头,如.spacespaceA-Z.spaceA-Z,然后将其替换为.&amp;nbsp;space。 [注:大写字母不被替换]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2019-06-19
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多