PHP htmlentities - PullRequest
       6

PHP htmlentities

2 голосов
/ 05 ноября 2010

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

Ответы [ 3 ]

3 голосов
/ 05 ноября 2010

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

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

См. this для получения подробной информации о str_replace из Официальной документации.

2 голосов
/ 06 ноября 2010

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

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

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

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

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

1 голос
/ 05 ноября 2010

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

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

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

...