使用HTMLPurifier或regexp删除嵌套的html标记

时间:2015-03-11 19:51:12

标签: php html regex

我正在寻找一种方法来摆脱一些嵌套的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文档,但找不到只删除嵌套标签的方法)

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

如果您别无选择,那么最好的办法是预先处理用单个字符替换打开/关闭标签的文本。 这使得更改更容易执行,并且您的预处理可以相当轻松地展开(请原谅我几年没有做任何PHP的代码):

$str = preg_replace('/\&/', '&amp;', $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('/\&amp;/',  '&', $str);

我在JS中有类似的东西来清理HTML,希望这有帮助。