htmlentities с исключениями

У меня есть несколько возможных тегов, например "<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> 

Каков наилучший способ сделать это.

Вы можете запускать 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 ); 

Единственное решение, которое я вижу, это загрузить его в синтаксический анализатор XML, а затем рекурсивно построить выходную строку самостоятельно, но это займет немного работы.

Примечание. Решение регулярного выражения (например, предложенное Галеном) не будет работать во всех случаях, потому что значения атрибутов могут содержать > .

У меня есть простое решение, которое сработало для меня хорошо:

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