使用正则表达式删除除少数白名单之外的所有标记

时间:2011-01-27 19:30:09

标签: php regex preg-replace eregi

我有一些带有类似HTML标签的文字,我想删除它。我只想允许大约十二个列入白名单的标签,例如< b>或者< i>。我不能使用PHP的条带标签,因为我需要使用正则表达式的更通用的解决方案(因为我的一些其他标签使用不同的约定,例如[tag]而不是< tag>)。怎么做到这个效果?

我现在使用的正则表达式是:

return preg_replace('/ \<[^\>]+\>/', '', $text);

如何更改它以排除我提到的标签?我查看了类似的问题,但他们没有提供我在这里提到的具体问题的解决方案。

3 个答案:

答案 0 :(得分:2)

如果您不能使用PHP的strip_tags(),请使用HTMLPurifier,这样您就可以安全地实施各种规则。

答案 1 :(得分:1)

无论如何要回答你的问题,你可以使用断言(?!..)来排除匹配中的内容:

preg_replace('#<(?!/?(a|b|i|div)\b)[^>]+>#'

但请记住,这不是一种非常可靠的方法。过滤标签名称很容易。要进行彻底的清理,您必须清理属性,使其变得复杂。试试HTMLPurifier,它已经包含大量的正则表达式。

答案 2 :(得分:1)

$wl = '(?!(?:b|tr|td)\b)';   // whitelist in group

$rxtags = '
<
(?:
    (?:
       (?:
           (?:' ."$wl". 'script|' ."$wl". 'style) \s*
         | (?:' ."$wl". 'script|' ."$wl". 'style) \s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*
       )> .*? </(?:' ."$wl". 'script|' ."$wl". 'style)\s*
    )
 |
    (?:
        /?' ."$wl". '\w+\s*/?
      | '   ."$wl". '\w+\s+ (?:".*?"|\'.*?\'|[^>]*?)+\s*/?
      | !(?:DOCTYPE.*?|--.*?--)
    )
)
>';

s/$rxtags//xsg

"/$rxtags/xs",修饰符:扩展,跨度,全局

' . "$wl" . '更改为' + "$wl" + ',或者在php中完成连接。