使用 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?
我正在使用 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?