2010-11-06 96 views
3

我有一些可能的標記集,例如"<main>", "<text>", "<tag>"。人物的休息,我想與ヶ輛(用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> 

什麼是做到這一點的最好辦法。

回答

2

您可以運行在文本ヶ輛然後使用正則表達式替換允許標籤<>

例...

$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); 
+0

您在$圓括號外面留下了$ v。 – 2010-11-06 18:23:27

+0

另外我認爲'''在屬性值中是允許的。 (我不確定。) – 2010-11-06 18:29:11

+0

您可以在屬性值中使用'>'。所以正則表達式在所有情況下都不起作用。 – 2010-11-06 18:35:07

1

我看到的唯一解決方案是將它加載到XML解析器中,然後遞歸地自己構建輸出字符串,但這需要一些工作。

注意:正則表達式解決方案(如Galen提出的解決方案)在所有情況下都不起作用,因爲屬性值可能包含>

1

我有一個簡單的解決方案,爲我工作很好:

$text = htmlentities($text, ENT_QUOTES, "UTF-8"); 
$text = htmlspecialchars_decode($text); 
$text = strip_tags($text, "<p><b><h2>");