Как в htmlentities выборочно кодировать символы, чтобы он не кодировал <
и >
тегов, а кодировал &
?
HTML-сущности PHP
Ответы (3)
Просто используйте:
<?php
$string = str_replace('&', '&', $string);
Подробнее о str_replace см. это. из официальной документации.
У вас нет опции «частично закодировать»; если есть определенные символы, которые вы хотите экранировать или не экранировать, вам придется сделать это вручную. Например, чтобы сделать то, что вы говорите, вы хотите:
str_replace('>', '>', str_replace('<', '<', htmlentities($s)))
Но что вы пытаетесь сделать? Вышеупомянутое вряд ли будет полезным. "
символов в разметке все равно будут экранированы, что приведет к искажению значений атрибутов.
htmlentities
также в целом вызывает сомнения, потому что, если вы специально не передадите ему правильный аргумент кодировки, он исказит любые символы, отличные от ASCII, в строке в неправильные ссылки на объекты HTML. Обычно лучше использовать htmlspecialchars()
, который влияет только на несколько символов, которые действительно являются специальными и нуждаются в экранировании в HTML.
Если все, что вы хотите сделать, это избежать символа &
, вы можете сделать это с помощью простого str_replace('&', '&', $s)
, но опять же, это все равно заменит амперсанды, которые являются частью действительной ссылки на сущность или символ. Вы уверены, что хотите это сделать? Вы просто пытаетесь исправить неправильно используемые неэкранированные амперсанды? Если это так, вы можете попробовать регулярное выражение, чтобы выбрать любое использование &
, которое не является допустимой ссылкой на сущность/символ.
Попробуйте что-то вроде этого:
$string = htmlentities($string);
$string = str_replace(array('<','>'), array('<', '>'), $string);
В официальной документации htmlentities и str_replace
<
и>
,&
и кавычек. - person Your Common Sense   schedule 05.11.2010