Кодировать сущности HTML, но игнорировать теги HTML - в PHP - PullRequest
8 голосов
/ 22 декабря 2009

У меня есть строка, которая может выглядеть следующим образом

$str = "<p>Me & Mrs Jones <br /> live in <strong style="color:#FFF;">España</strong></p>";
htmlentities($str,ENT_COMPAT,'UTF-8',false);

Как преобразовать текст в HTML-объекты без преобразования тегов HTML?

примечание: мне нужно сохранить HTML нетронутым

Ответы [ 5 ]

6 голосов
/ 22 декабря 2009

Отказ от ответственности: я бы не кодировал никакие объекты, кроме <,> и &. Тем не менее, если вы действительно хотите это, сделайте следующее:

$str = '...';
$str = htmlentities($str,ENT_NOQUOTES,'UTF-8',false);
$str = str_replace(array('&lt;','&gt;'),array('<','>'), $str);
1 голос
/ 03 сентября 2013

Хороший ответ опубликовал Паскаль МАРТИН

См. Эту ТАКУЮ тему

Чтобы возобновить, вы можете использовать этот фрагмент кода, чтобы получить список соответствий character => entity:

$list = get_html_translation_table(HTML_ENTITIES);
unset($list['"']);
unset($list['<']);
unset($list['>']);
unset($list['&']);
1 голос
/ 22 декабря 2009

Проблема, с которой вы сталкиваетесь, заключается в том, что при данных обстоятельствах вы уже закодировали '<' и '>' в своем тексте, поэтому вы должны отфильтровать их после преобразования.

Это похоже на ответ Эверта, но добавляет еще один шаг, чтобы разрешить содержание, подобное 1 < 2 в вашей разметке:

$str = htmlentities($str,ENT_NOQUOTES,'UTF-8',false);
$str = str_replace(array('&lt;','&gt;'),array('<','>'), $str);
$str = str_replace(array('&amp;lt;','&amp;gt'),array('&lt;','&gt;'), $str);
0 голосов
/ 22 декабря 2009

Я раньше не использовал htmlentities, но кажется, что это более надежная версия urlencode (которую я часто использую). Возможно, вы захотите попробовать:

htmlentities(strip_tags($str,ENT_COMPAT),'UTF-8',false);

Точно так же, как маленький самородок, если вы хотите сохранить <br> в качестве стандартного возврата каретки, вы можете сделать это:

htmlentities(strip_tags(str_replace("<br>","\n",$str,ENT_COMPAT)),'UTF-8',false);

Я знаю, что мне иногда нравится это делать.

Удачи.

0 голосов
/ 22 декабря 2009

Если вы хотите преобразовать только текст, попробуйте следующее:

$orig = "<p>Me & Mrs Jones <br /> live in <strong style="color:#FFF;">España</strong></p>";
$str = strip_tags($orig);

$str = htmlentities($str,ENT_COMPAT,'UTF-8',false);
...