【发布时间】:2014-09-12 16:01:49
【问题描述】:
我正在显示已在所见即所得编辑器中编写的内容(一个名为 $ps 的字符串,其中填充了 html)(未使用外部 css)并包含空格,例如
<p>
<span style="font-family: Calibri, sans-serif; font-size: 11pt;">
<br></br>
</span>
<span style="font-size: 11pt; font-family: Calibri, sans-serif;">
</span>
</p>
我想使用 php 删除(因为我希望作者继续不小心添加空的东西)。
到目前为止,我的代码效率非常低:
$ps = preg_replace('#class="(.*?)"#', '',$ps);
$ps = preg_replace('#style="(.*?)"#', '',$ps);
$ps = preg_replace('#<br\s*/*>#i', '',$ps);
$ps = preg_replace('#<span\s*/*>#i', '',$ps);
$ps = preg_replace('#<p>\s*</p>#i', '',$ps);
这大约是一半好,留给我:
<p>
</p>
<p>
</p>
如果空的东西看起来有点不同,我怀疑它不会可靠地工作。
你能帮我建立一个更好的解决方案吗?我可以轻松实施?与我迄今为止的尝试不同,也许是一个有效的正则表达式..
谢谢!
【问题讨论】:
-
第一件事(不管这是否是一个好方法) preg_replace 可以接受一组正则表达式。即:
preg_replace(array('#class="(.*?)"#', '#style="(.*?)"#', '#<br\s*/*>#i', '#<span\s*/*>#i', '#<p>\s*</p>#i'), '',$ps); -
我认为您应该使用DOMXPath 删除空节点。正则表达式不适用于 HTML。检查这 2 个 SO 解决方案。 stackoverflow.com/questions/8603237/… 和 stackoverflow.com/questions/11744454/…
-
用正则表达式解析 HTML 是一个悲伤的秘诀。当您的用户输入与您的期望不符时,您的正则表达式将会中断。例如,如果您的
<p></p>标签位于不同的行上怎么办?使用正则表达式修改 HTML 更糟糕。使用适当的 HTML 解析器。 -
您可能会发现我对一个非常相似的问题的回答很有用:Remove all empty HTML tags?
标签: php html regex html-parsing