php - 使用 HTMLPurifier 或正则表达式删除嵌套的 html 标签

标签 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 文档,但找不到只删除嵌套标签的方法)

非常感谢您的帮助。

最佳答案

如果您别无选择,那么最好的办法是预处理文本,用单个字符替换打开/关闭标签。 这使得更改更容易执行,并且您的预处理可以相当轻松地展开(请原谅我几年没有做任何 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,希望这有帮助。

关于php - 使用 HTMLPurifier 或正则表达式删除嵌套的 html 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996056/

相关文章:

javascript - jQuery Toggle (Expanding Div) 与文本的不一致过渡

c# - 在 asp.net 中将三个图像合并为一个图像

javascript 验证文本输入框中字母和数字的可变序列

javascript - 模式的 Smarty 异常

php - 为什么使用我的主键 'code_giac' 来更新我的字段?

php - 如何选择从哪里开始mysql_fetch_row?

php - 为什么 mysql 在与 PDO 一起使用时只创建临时表?

php - 如何更改 Wordpress 中 WooCommerce "My Account"菜单的 URL?

Python 正则表达式 url 抓取

regex - 提取位于匹配模式之后或之间的字符串