используя новую константу php 5.4 ENT_DISALLOWED в htmlentities

Есть строка, которую я пытаюсь вывести в формате htmlencoded, а функция htmlentities() всегда возвращает пустую строку.

Я точно знаю, почему это так. Ну, я не использую PHP 5.4, у меня установлена ​​последняя версия PHP 5.3.

Вопрос в том, как я смогу htmlencode строку с недопустимыми последовательностями кодовых единиц.

Согласно мануалу, ENT_SUBSTITUTE - это путь. Но эта константа не определена в PHP 5.3.X.

Я сделал это:

if (!defined('ENT_SUBSTITUTE')) {
    define('ENT_SUBSTITUTE', 8);
}

все равно не повезло. htmlentities по-прежнему возвращает пустую строку.

Вместо этого я хотел попробовать ENT_DISALLOWED, но не могу найти для него соответствующее длинное значение.

Итак, мой вопрос состоит из двух частей

  1. Каково постоянное значение ENT_DISALLOWED в PHP 5.4?

  2. Как убедиться, что строка, содержащая символы, отличные от UTF-8 (например, умные кавычки), можно ли их очистить? - Не только умные кавычки, но и все, что заставляет htmlentities() возвращать пустую строку.


person Average Joe    schedule 18.09.2012    source источник


Ответы (2)


Это правда, что htmlentities() в PHP 5.3 не имеет флага ENT_SUBSTITUTE, однако он имеет (на самом деле не рекомендуется) флаг ENT_IGNORE. Обратите внимание на примечание и постарайтесь понять его перед использованием:

Не рекомендуется использовать этот флаг, так как он » может иметь последствия для безопасности.

Гораздо лучше, если вы понимаете, почему возникла проблема с входной строкой. Чаще всего пользователям не хватает только указать правильную кодировку.

Например. сначала перекодируйте строку в UTF-8, затем передайте ее в htmlspecialchars() или htmlentities(). Говоря о смарт-кавычках, вы, вероятно, используете строку, закодированную в Windows-1252. Вам даже не нужно будет конвертировать его перед использованием, вы можете просто правильно указать кодировку (PHP 5.3):

htmlentities($string, ENT_QUOTES, $encoding = 'Windows-1252');

Естественно, это работает, только если ввод $string закодирован в Windows-1252 (CP1252). Сначала узнайте правильную кодировку, тогда это обычно не проблема. Для неподдерживаемых кодировок сначала перекодируйте в поддерживаемую, например, с помощью iconv или mb_string.

person hakre    schedule 11.05.2013
comment
Если кто-то ищет это, потому что он следует Lynda.com MYSQL Essential Training и столкнулся с ошибкой использования неопределенной константы ENT_SUBSTITUTE в строке 600 в Sid.php, я скажу вам на основе того, что я прочитал здесь, и что я не мог найти четкий эквивалентный флаг для PHP 5.3, я пошел дальше и удалил этот флаг, и теперь приложение работает нормально. Как отметил @hakre, есть последствия для безопасности, но я работаю над локальным сервером разработки без доступа к Интернету. - person Eric Hepperle - CodeSlayer2010; 02.07.2015

Как вы сказали, эти константы были добавлены в 5.4.0. Дело в том, что поддержка является новой для 5.4.0. Это означает, что вы можете передавать любые значения, которые вы хотите, старые htmlentities этого не поймут.

Скорее всего, журнал изменений php вводит в заблуждение.

person Mikulas Dite    schedule 24.09.2012