使用 preg_replace 将所有 html 标签放在换行的段落中

Using preg_replace to put all html tags within paragraph on new lines

我正在使用 preg_replace 使段落块中的所有 html 标签换行,例如<strong></strong><a></a>。但是,它会在任何替换标签的末尾造成额外的白色space。

代码如下:

$text = preg_replace('/\/[a-zA-Z0-9]+>/', "[=12=]\n", $text);

这是检查器工具中返回的 html 输出示例:

<p>
  "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent "
  <strong>faucibus ut turpis </strong>
  <a href="#" target="_blank">eu consequat</a>
  " . Etiam fermentum nisi id massa ultricies, non pretium libero tempus.
</p>

如您所见,这会在超链接之后和句号之前添加 space。

在html中,换行符是空格。您的代码正在运行 - 它在每个标记后插入一个换行符(空格)。

检查员不会区分 html 中的空格类型,因为它们都是等价的。

正如其他人已经评论的那样,白色 space 在那里是因为您将它与“\n”字符一起插入(可能 basically this answer)。

段落内的语义(在HTML中你可以用<p>标签开始一个段落,结束标签是可选的)你可能想要换行符“\n”来格式化源代码但是您可能不希望它添加到(可见的)白色space。

如果原始出处是

 <a href="#" target="_blank">eu consequat</a>" . Etiam fermentum nisi id massa ultricies, non pretium libero tempus.

使用您的正则表达式生成的结果是在结束 </a> 标记之后添加换行符,此后就是白色 space。它变得可见,因为之前没有白色space。

如果在插入换行符“\n”之前包含任何非白色space,则可以保留白色space处理,因为多个白色space字符显示为一个 space 当 HTML 在浏览器中呈现时。

这可能更接近您对源代码制作的预期:

$text = preg_replace('/\/[a-zA-Z0-9]+>\S*/', "[=11=]\n", $text);

\S 是任何非白色 space 字符(与 \s 相反,请注意 US-ASCII 编码,IIRC 应该足以满足 HTML 编码UTF-8 也是如此,否则请研究 PCRE_UTF8 和 PCRE_UCP 动词);

并且应该会产生如下效果:

  <a href="#" target="_blank">eu consequat</a>"
  . Etiam fermentum nisi id massa ultricies, non pretium libero tempus.

因为前面有whitespace而且link直接在双引号结束,所以HTML渲染应该不会影响whitespace 因为没有引入新的白色space 段。

然而,请对此持保留态度,这确实是此处某些字符的微观层面。

白色space的处理规则可能在我的回答中得到了简化,HTML中白色space的规范和浏览器中的实现相加:

  • When does whitespace matter in HTML?