我有一些带有类似HTML标签的文字,我想删除它。我只想允许大约十二个列入白名单的标签,例如< b>或者< i>。我不能使用PHP的条带标签,因为我需要使用正则表达式的更通用的解决方案(因为我的一些其他标签使用不同的约定,例如[tag]而不是< tag>)。怎么做到这个效果?
我现在使用的正则表达式是:
return preg_replace('/ \<[^\>]+\>/', '', $text);
如何更改它以排除我提到的标签?我查看了类似的问题,但他们没有提供我在这里提到的具体问题的解决方案。
答案 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中完成连接。