我有一些可能的标签,例如"<main>", "<text>", "<tag>"
。我希望用htmlentities(htmlspecialchars)处理的其他角色
<main>
<text>
<tag> <> X&Y < <falsetag> <tag attr="123" /> </tag>
</text>
</main>
结果应为
<main>
<text>
<tag> <> X&Y < <falsetag> <tag attr="123" /> </tag>
</text>
</main>
最好的方法是什么。
答案 0 :(得分:2)
您可以在文本上运行htmlentities,然后使用正则表达式替换允许的标记<>
示例...
$str = '<main>
<text>
<tag> <> X&Y < <falsetag> <tag attr="123" /> </tag>
</text>
</main>
';
$allowed_tags = array( 'tag', 'text', 'main' );
$escaped_str = htmlentities( $str );
$replace_what = array_map( function($v){ return "~<(/?)$v(.*?)>~"; }, $allowed_tags );
$replace_with = array_map( function($v){ return "<$1$v$2>"; }, $allowed_tags );
echo preg_replace( $replace_what, $replace_with, $escaped_str );
答案 1 :(得分:1)
我看到的唯一解决方案是将其加载到XML解析器中,然后自己递归地构建输出字符串,但这需要一些工作。
注意:正则表达式解决方案(就像Galen提出的那样)在所有情况下都不起作用,因为属性值可能包含>
。
答案 2 :(得分:1)
我有一个对我有用的简单解决方案:
$text = htmlentities($text, ENT_QUOTES, "UTF-8");
$text = htmlspecialchars_decode($text);
$text = strip_tags($text, "<p><b><h2>");