我需要在我们整个网站的每个句子的每个句号后面有两个空格(不要问)。
一种方法是在每个句点后手动添加 。这将需要几个小时。
我们不能只是查找并替换每个句点,因为我们在 PHP 和其他情况下有串联,先有一个句点,然后有一个空格,但它不在句子中。
有没有办法做到这一点......并且一切在 Internet Explorer 6 中仍然有效?
[编辑] - 棘手的部分是在代码中,有些 PHP 行包含点,周围有空格,如下所示:
<?php echo site_url('/css/' . $some_name .'.css');?>
我绝对不希望有额外的空格来换行,所以我很乐意在每个句号后面添加两个可见的空格在所有 P 标签中。
众所周知,HTML 会折叠空白,但它只是为了显示而这样做。多余的空间仍然存在。因此,如果源材料在每个句点后创建了两个空格,那么所建议的一些替换方法可以可靠地工作 - 搜索“句点-空间-空间”并将其替换为更合适的内容,例如句点-空间- 。请注意,您不应使用 ,因为它会妨碍页边距正确换行。 (如果您使用的是锯齿状右侧,只要您在空格之前使用 nbsp,边距变化就不会明显。)
您还可以将每个句子包裹在一个跨度中,并使用 :after 选择器添加一个空格并将其格式化为“word-spacing”宽。或者,您可以直接将句子本身之间的空格包裹在跨度和样式中。
我为博主编写了一个 JavaScript 解决方案,它可以动态执行此操作,查找句点-空间-空间,并将其替换为看起来更宽的跨度样式空间。
但是,如果你的原始材料不包含这类内容,那么你就必须研究句子边界检测算法(这并不那么简单),然后修改一个算法,以免绊倒 PHP 代码。
您也许可以使用 JavaScript split 方法或正则表达式,具体取决于文本的范围。
分割方法如下:
var el = document.getElementById("mydiv");
if (el){
el.innerText = el.innerText.split(".").join(".\xA0 ");
}
测试用例:
Hello world。句号后面插入空格。使用 split 方法。
结果:
世界你好。在句号后插入空格。使用分割方法。
您考虑过使用输出缓冲区吗? ob_start($callback)
未经测试,但如果您将其放在任何输出之前(或者更好,卸载该函数):
<?php
function processDots($buffer)
{
return (str_replace(".", ". ", $buffer));
}
ob_start("processDots");
?>
并将其添加到输入末尾:
<?php ob_end_flush(); ?>
可能会起作用:)
如果您不反对“后处理”/“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,但这不是必需的。
附注我看到您关于并非所有句号和空格都应受到平等对待的评论,但这已经是最好的了。否则,您将需要更好/更防弹的方法。
将这样的内容合并到您的 PHP 文件中:
<?php if (preg_match('/^. [A-Z]$/' || '/^. [A-Z]$/')) { preg_replace('. ', '. '); } ?>
这允许您搜索每个新句子的开头,如
.spacespaceA-Z
或 .spaceA-Z
,然后将其替换为 . space
。 【注:大写字母不被替换】
elbrant 的代码不起作用。我复制了整个内容,但到处都出现验证错误。
错误解析错误:语法错误,意外标记“<", expecting end of file in your code on line 5