有例外情况的人

时间:2010-11-06 17:45:08

标签: php xml special-characters

我有一些可能的标签,例如"<main>", "<text>", "<tag>"。我希望用htmlentities(htmlspecialchars)处理的其他角色

<main>
<text>
<tag> <>  X&Y <  <falsetag> <tag attr="123" /> </tag>
</text>
</main>

结果应为

<main>
<text>
<tag> &lt;&gt;  X&amp;Y &lt;  &lt;falsetag&gt; <tag attr="123" /> </tag>
</text>
</main>

最好的方法是什么。

3 个答案:

答案 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 "~&lt;(/?)$v(.*?)&gt;~"; }, $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>");