【问题标题】:removing nested html tags using HTMLPurifier or regexp使用 HTMLPurifier 或 regexp 删除嵌套的 html 标签
【发布时间】:2015-05-13 19:11:33
【问题描述】:

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

非常感谢您的帮助。

【问题讨论】:

  • 不要使用正则表达式。正则表达式无法解析 HTML,你会在尝试中发疯。
  • html 似乎不太适合嵌套。
  • 非常感谢您的回答。你能想到一个好的工具来实现这个输出吗?不幸的是我不能改变输入。我想使用一个像 HTlML Purfier 这样的工具,但它似乎不支持这个用例。

标签: php html regex


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2013-10-19
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多