У меня есть несколько возможных тегов, например "<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>
Каков наилучший способ сделать это.
Вы можете запускать 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 );
Единственное решение, которое я вижу, это загрузить его в синтаксический анализатор XML, а затем рекурсивно построить выходную строку самостоятельно, но это займет немного работы.
Примечание. Решение регулярного выражения (например, предложенное Галеном) не будет работать во всех случаях, потому что значения атрибутов могут содержать >
.
У меня есть простое решение, которое сработало для меня хорошо:
$text = htmlentities($text, ENT_QUOTES, "UTF-8"); $text = htmlspecialchars_decode($text); $text = strip_tags($text, "<p><b><h2>");