HTML-сущности PHP

Как в htmlentities выборочно кодировать символы, чтобы он не кодировал < и > тегов, а кодировал &?


person eriurghikgbriehn    schedule 05.11.2010    source источник
comment
Вы про .:;,!?? Если да, то почему вы хотите их кодировать? Или вы про кавычки?   -  person thejh    schedule 05.11.2010
comment
1. никогда не используйте htmlentities. 2. никогда не кодируйте ничего, кроме < и >, & и кавычек.   -  person Your Common Sense    schedule 05.11.2010
comment
Вероятнее всего, правильным решением этой проблемы будет Забудьте о кодировании сущностей и просто убедитесь, что вы объявили используемую вами кодировку символов: w3.org/International/O-charset   -  person Quentin    schedule 06.11.2010


Ответы (3)


Просто используйте:

<?php
$string = str_replace('&', '&amp;', $string);

Подробнее о str_replace см. это. из официальной документации.

person Pascal Qyy    schedule 05.11.2010

У вас нет опции «частично закодировать»; если есть определенные символы, которые вы хотите экранировать или не экранировать, вам придется сделать это вручную. Например, чтобы сделать то, что вы говорите, вы хотите:

str_replace('&gt;', '>', str_replace('&lt;', '<', htmlentities($s)))

Но что вы пытаетесь сделать? Вышеупомянутое вряд ли будет полезным. " символов в разметке все равно будут экранированы, что приведет к искажению значений атрибутов.

htmlentities также в целом вызывает сомнения, потому что, если вы специально не передадите ему правильный аргумент кодировки, он исказит любые символы, отличные от ASCII, в строке в неправильные ссылки на объекты HTML. Обычно лучше использовать htmlspecialchars(), который влияет только на несколько символов, которые действительно являются специальными и нуждаются в экранировании в HTML.

Если все, что вы хотите сделать, это избежать символа &, вы можете сделать это с помощью простого str_replace('&', '&amp;', $s), но опять же, это все равно заменит амперсанды, которые являются частью действительной ссылки на сущность или символ. Вы уверены, что хотите это сделать? Вы просто пытаетесь исправить неправильно используемые неэкранированные амперсанды? Если это так, вы можете попробовать регулярное выражение, чтобы выбрать любое использование &, которое не является допустимой ссылкой на сущность/символ.

person bobince    schedule 05.11.2010

Попробуйте что-то вроде этого:

$string = htmlentities($string);
$string = str_replace(array('&lt;','&gt;'), array('<', '>'), $string);

В официальной документации htmlentities и str_replace

person Parris Varney    schedule 05.11.2010
comment
эээ... во втором примере вы забыли один параметр - person thejh; 06.11.2010
comment
@Col Похоже, что исходный пост хотел использовать htmlentities для кодирования всего, кроме ‹ и › - person Parris Varney; 06.11.2010
comment
Похоже, что оригинальный постер понятия не имеет, что он делает. Как и многие другие плакаты. ВЫ видите смысл в своем ответе? Зачем спешить, чтобы ответить на плохой вопрос? Зачем отвечать буквально? Мы не роботы. Мы люди. Кто может подумать, прежде чем действовать. По крайней мере, должен. - person Your Common Sense; 06.11.2010