2009-12-22 3 views
8

У меня есть строка, которая может выглядеть как этотEncode HTML сущности, но игнорировать HTML-теги - в PHP

$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 нетронутым

+0

Возможный дубликат: http://stackoverflow.com/q/1364933/1032370 –

ответ

-1

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

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

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

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

Подобно тому, как маленький самородок, если вы хотите сохранить <br> как стандартные возвратов carrage, вы можете сделать это:

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

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

Удачи.

+0

urlencode и htmlentities делают разные вещи: urlencode делает строку действительной для размещения в URL-адресе (например, turn & into% 26), htmlentities вытесняет sring для использования в HTML (например, превращая <в <). –

6

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

$str = '...'; 
$str = htmlentities($str,ENT_NOQUOTES,'UTF-8',false); 
$str = str_replace(array('&lt;','&gt;'),array('<','>'), $str); 
+1

Я тоже хотел бы с этим поделать, в большинстве случаев нет необходимости кодировать «и». И еще такие вещи, как €, á, é, должны обрабатываться Unicode. –

+2

За исключением этого не получится, если у него есть «2> 5 "в его разметке – TravisO

+0

@TravisO: Я ожидаю, что вход будет действительным HTML уже. Если у него есть 2> 5 в его разметке, это не будет обрабатываться так же, как << не обрабатывается правильно. – Evert

1

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

Это похоже на ответ Эверт, но добавляет еще один шаг, чтобы для контента, как 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); 
1

Хороший ответ был пост по Pascal MARTIN

Смотрите эту SO topic

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

$list = get_html_translation_table(HTML_ENTITIES); 
unset($list['"']); 
unset($list['<']); 
unset($list['>']); 
unset($list['&']);