如何在 HTML 中的每个句号后面添加两个空格?

问题描述 投票:0回答:6

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

一种方法是在每个句点后手动添加   。这将需要几个小时。

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

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

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

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

我绝对不希望有额外的空格来换行,所以我很乐意在每个句号后面添加两个可见的空格在所有 P 标签中

html spaces
6个回答
10
投票

众所周知,HTML 会折叠空白,但它只是为了显示而这样做。多余的空间仍然存在。因此,如果源材料在每个句点后创建了两个空格,那么所建议的一些替换方法可以可靠地工作 - 搜索“句点-空间-空间”并将其替换为更合适的内容,例如句点-空间- 。请注意,您不应使用 ,因为它会妨碍页边距正确换行。 (如果您使用的是锯齿状右侧,只要您在空格之前使用 nbsp,边距变化就不会明显。)

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

我为博主编写了一个 JavaScript 解决方案,它可以动态执行此操作,查找句点-空间-空间,并将其替换为看起来更宽的跨度样式空间。

但是,如果你的原始材料不包含这类内容,那么你就必须研究句子边界检测算法(这并不那么简单),然后修改一个算法,以免绊倒 PHP 代码。


4
投票

您也许可以使用 JavaScript split 方法或正则表达式,具体取决于文本的范围。

分割方法如下:

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

测试用例:

Hello world。句号后面插入空格。使用 split 方法。

结果:

世界你好。在句号后插入空格。使用分割方法。


3
投票

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

未经测试,但如果您将其放在任何输出之前(或者更好,卸载该函数):

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

    ob_start("processDots");
?>

并将其添加到输入末尾:

<?php ob_end_flush(); ?>

可能会起作用:)


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,但这不是必需的。

附注我看到您关于并非所有句号和空格都应受到平等对待的评论,但这已经是最好的了。否则,您将需要更好/更防弹的方法。


1
投票

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

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

这允许您搜索每个新句子的开头,如

.spacespaceA-Z
.spaceA-Z
,然后将其替换为
.&nbsp;space
。 【注:大写字母不被替换】


0
投票

elbrant 的代码不起作用。我复制了整个内容,但到处都出现验证错误。

错误解析错误:语法错误,意外标记“<", expecting end of file in your code on line 5

© www.soinside.com 2019 - 2024. All rights reserved.