我正在寻找一种方法来摆脱一些嵌套的 html 标签,并且已经花了一些时间来寻找这样做的正确方法。 因为我已经在使用 HTML Purifier,所以我想找到一种使用它的方法,但也知道其他可能的解决方案(例如,在 PHP 中使用正则表达式的正确方法)会很棒:)
这是我拥有的 HTML 结构的示例:
<p><span><span>SOME TEXT</span></span></p>
<table><tbody><tr>
<td><span><span>SOME TEXT</span></span><span>SOME MORE TEXT</span></td>
<td><div><span><span>SOME TEXT</span></span></div><div><span>SOME MORE TEXT</span></div></td>
</tr></tbody></table>
<p>SOME TEXT</p>
我想得到这个输出:
<p><span><span>SOME TEXT</span></span></p>
<table><tbody><tr>
<td>SOME TEXT SOME MORE TEXT</td>
<td>SOME TEXT SOME MORE TEXT</td>
</tr></tbody></table>
<p>SOME TEXT</p>
所以我基本上想要的是一种删除嵌套在 td 标签中的所有 div 和 span 标签的方法,然后才删除。
是否有使用 HTML Purifier 实现此目的的方法,或者有人知道获得此结果的另一种方法吗? (我已经检查了 HTML Purifier 文档,但找不到只删除嵌套标签的方法)
非常感谢您的帮助。
最佳答案
如果您别无选择,那么最好的办法是预处理文本,用单个字符替换打开/关闭标签。 这使得更改更容易执行,并且您的预处理可以相当轻松地展开(请原谅我几年没有做任何 php 的代码):
$str = preg_replace('/\&/', '&', $str);
$str = preg_replace('/\@/', '&at;', $str);
$str = preg_replace('/\#/', '&hash;', $str);
$str = preg_replace('/\<td/', '@', $str);
$str = preg_replace('/\<\/td/', '#', $str);
while preg_match('/(\@[^\#]*)<[\/]?span[^\>]*>/', $str) {
$str = preg_replace('/(\@[^\#]*)<[\/]?span[^\>]*>/', '$1', $str);
}
$str = preg_replace('/\@/', '<td', $str);
$str = preg_replace('/\#/', '</td', $str);
$str = preg_replace('/\&hash;/', '#', $str);
$str = preg_replace('/\&at;/', '@', $str);
$str = preg_replace('/\&/', '&', $str);
我在 JS 中有类似的东西来清理 HTML,希望这有帮助。
关于php - 使用 HTMLPurifier 或正则表达式删除嵌套的 html 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996056/