htmlspecialchars
Некоторые символы имеют особое значение в HTML и должны быть представлены объектами HTML, если они хотят сохранить свое значение. Эта функция возвращает строку с этими преобразованиями. Если вам требуется, чтобы все входные подстроки, связанные с именованными объектами, были переведены, используйте вместо этого htmlentities () .
Если входная строка, переданная этой функции, и конечный документ используют один и тот же набор символов, этой функции достаточно для подготовки ввода для включения в большинство контекстов HTML-документа. Однако если входные данные могут представлять символы, которые не закодированы в окончательном наборе символов документа, и вы хотите сохранить эти символы (как числовые или именованные сущности), и эта функция, и htmlentities () (которая кодирует только подстроки с именованными сущностями эквиваленты) может быть недостаточно. Возможно, вам придется использовать вместо этого mb_encode_numericentity () .
Character | Replacement |
---|---|
& (ampersand) | & |
» (двойная кавычка) | " , Если ENT_NOQUOTES не установлен |
‘ (одинарная кавычка) | ' (для ENT_HTML401 ) или ' apos ; (для ENT_XML1 , ENT_XHTML или ENT_HTML5 ), но только тогда , когда ENT_QUOTES находится множество |
< (меньше чем) | < |
> (больше чем) | > |
Parameters
Битовая маска одного или нескольких из следующих флагов, которые определяют, как обрабатывать кавычки, неверные последовательности кодовых единиц и используемый тип документа. По умолчанию ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 .
Constant Name | Description |
---|---|
ENT_COMPAT | Будет преобразовывать двойные кавычки и оставлять одиночные кавычки. |
ENT_QUOTES | Будет конвертировать как двойные,так и одинарные котировки. |
ENT_NOQUOTES | Оставит как двойные,так и одинарные котировки неперевернутыми. |
ENT_IGNORE | Отбрасывайте недопустимые последовательности единиц кода без вывода сообщений вместо возврата пустой строки. Использование этого флага не рекомендуется, так как » это может иметь последствия для безопасности . |
ENT_SUBSTITUTE | Замените недопустимые последовательности кодовых единиц на заменяющий символ Unicode U + FFFD (UTF-8) или & # xFFFD; (в противном случае) вместо возврата пустой строки. |
ENT_DISALLOWED | Замените недопустимые кодовые точки для данного типа документа символом замены Unicode U + FFFD (UTF-8) или & # xFFFD; (в противном случае) вместо того, чтобы оставить их как есть. Это может быть полезно, например, для обеспечения правильного формата XML-документов со встроенным внешним содержимым. |
ENT_HTML401 | Код обработки как HTML 4.01. |
ENT_XML1 | Код обработки как XML 1. |
ENT_XHTML | Код обработки как XHTML. |
ENT_HTML5 | Код обработки как HTML 5. |
Необязательный аргумент,определяющий кодировку,используемую при преобразовании символов.
Если не указано , encoding умолчанию равна значению параметра конфигурации default_charset .
Хотя этот аргумент технически необязателен, настоятельно рекомендуется указать правильное значение для вашего кода, если параметр конфигурации default_charset может быть установлен неправильно для данного ввода.
Для целей этой функции кодировки ISO-8859-1 , ISO-8859-15 , UTF-8 , cp866 , cp1251 , cp1252 и KOI8-R фактически эквивалентны при условии, что сама string является допустимой для кодировки, как символы, на которые влияет htmlspecialchars (), занимают одни и те же позиции во всех этих кодировках.
Поддерживаются следующие наборы символов:
Charset | Aliases | Description |
---|---|---|
ISO-8859-1 | ISO8859-1 | Западноевропейский,латинский-1. |
ISO-8859-5 | ISO8859-5 | Небольшое количество использованной кириллицы (латиница/кириллица). |
ISO-8859-15 | ISO8859-15 | Западноевропейский,латинский-9.Добавляет знак евро,отсутствующие французские и финские буквы на латинице-1 (ISO-8859-1). |
UTF-8 | ASCII-совместимый многобайтовый 8-битный Юникод. | |
cp866 | ibm866, 866 | Специфическая кириллическая карта для DOS. |
cp1251 | Windows-1251, win-1251, 1251 | Оконная специфическая кириллическая диаграмма. |
cp1252 | Windows-1252, 1252 | Специфическая для Windows кодировка для Западной Европы. |
KOI8-R | koi8-ru, koi8r | Russian. |
BIG5 | 950 | Традиционный китайский,в основном используется на Тайване. |
GB2312 | 936 | Упрощенный китайский,национальный стандартный набор символов. |
BIG5-HKSCS | Большой 5 с гонконгскими пристройками,традиционный китайский. | |
Shift_JIS | SJIS, SJIS-win, cp932, 932 | Japanese |
EUC-JP | EUCJP, eucJP-win | Japanese |
MacRoman | Шарсет,который использовался в Mac OS. | |
» | Пустая строка активирует обнаружение по кодировке скрипта (многобайтовый Zend), default_charset и текущей локали (см. Nl_langinfo () и setlocale () ) в этом порядке. Не рекомендуется. |
Примечание : любые другие наборы символов не распознаются. Вместо этого будет использоваться кодировка по умолчанию, и будет выдано предупреждение.
Когда double_encode отключен, PHP не будет кодировать существующие объекты html, по умолчанию конвертируется все.
Return Values
Если входная string содержит недопустимую последовательность единиц кода в заданной encoding , будет возвращена пустая строка, если не ENT_IGNORE флаги ENT_IGNORE или ENT_SUBSTITUTE .
Changelog
Version | Description |
---|---|
8.1.0 | flags изменены с ENT_COMPAT на ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 . |
Examples
Пример # 1 htmlspecialchars () Пример
$new = htmlspecialchars("Test", ENT_QUOTES); echo $new; // <a href='test'>Test</a> ?>
Notes
Note:
Обратите внимание, что эта функция не переводит ничего, кроме перечисленного выше. Полный перевод сущностей см. В htmlentities () .
- Когда ни один из ENT_COMPAT , ENT_QUOTES , ENT_NOQUOTES не присутствует, значение по умолчанию — ENT_NOQUOTES .
- Когда присутствует более одного из ENT_COMPAT , ENT_QUOTES , ENT_NOQUOTES , ENT_QUOTES имеет наивысший приоритет, за которым следует ENT_COMPAT .
- Когда ни один из ENT_HTML401 , ENT_HTML5 , ENT_XHTML , ENT_XML1 не присутствует, по умолчанию используется ENT_HTML401 .
- Когда присутствует более одного из ENT_HTML401 , ENT_HTML5 , ENT_XHTML , ENT_XML1 , ENT_HTML5 имеет наивысший приоритет, за ним следуют ENT_XHTML , ENT_XML1 и ENT_HTML401 .
- Когда присутствует более одного из ENT_DISALLOWED , ENT_IGNORE , ENT_SUBSTITUTE , ENT_IGNORE имеет наивысший приоритет, за которым следует ENT_SUBSTITUTE .
See Also
- get_html_translation_table () — возвращает таблицу перевода, используемую htmlspecialchars и htmlentities
- htmlspecialchars_decode () — Конвертирует специальные объекты HTML обратно в символы
- strip_tags () — Удаляет теги HTML и PHP из строки
- htmlentities () — Преобразует все применимые символы в объекты HTML
- nl2br () — вставляет разрывы строк HTML перед всеми символами новой строки в строке
PHP 8.2
(PHP 4 4.3.0,5,7,8)html_entity_decode Преобразование сущностей в соответствующие им символы html_entity_decode()является противоположностью htmlentities()в
(PHP 4,5,7,8)htmlentities Преобразование всех применимых символов в Эта функция идентична htmlspecialchars()во всех отношениях,за исключением htmlentities(),
(PHP 5 5.1.0,7,8)htmlspecialchars_decode Преобразование сущностей обратно в символы Эта функция противоположна htmlspecialchars().
(PHP 5,7,8)http_build_query Generate URL-encoded string Генерирует URL-encoded строку запроса из предоставленного ассоциативного (или индексированного)массива.
Создание XML-документа в PHP (escape-символы)
Я создаю XML-документ из PHP-скрипта, и мне нужно избежать специальных символов XML. Я знаю список символов, которые должны быть экранированы; но каков правильный способ сделать это?
Должны ли символы сбежать только с помощью обратного слэша (\) или что это правильный способ? Есть ли встроенная функция PHP, которая может справиться с этим для меня?
Используйте классы DOM для создания всего XML-документа. Он будет обрабатывать кодировки и декодирования, о которых мы даже не хотим заботиться.
Редактировать: Это критиковали @ Чалвак:
Объект DOM создает полный XML-документ, он не просто поддается просто кодированию строки на своем собственном.
Что не так, DOMDocument может корректно выводить только фрагмент, а не весь документ:
Test & and encode :) Test & <b> and encode </b> :)
$doc = new DOMDocument(); $fragment = $doc->createDocumentFragment(); // adding XML verbatim: $xml = "Test & and encode :)\n"; $fragment->appendXML($xml); // adding text: $text = $xml; $fragment->appendChild($doc->createTextNode($text)); // output the result echo $doc->saveXML($fragment);
Я создал простую функцию, которая скрывается с пятью «предопределенными сущностями», которые находятся в XML:
function xml_entities($string) < return strtr( $string, array( ""<", ">" => ">", '"' => """, "'" => "'", "&" => "&", ) ); >
Пример использования Демонстрация :
$text = "Test & and encode :)"; echo xml_entities($text);
Подобный эффект может быть достигнут с помощью str_replace но он хрупкий из-за двойной замены (непроверенный, не рекомендуется):
function xml_entities($string) < return str_replace( array("&", "", '"', "'"), array("&", "<", ">", """, "'"), $string ); >
Как насчет функции htmlspecialchars() ?
htmlspecialchars($input, ENT_QUOTES | ENT_XML1, $encoding);
Примечание: флаг ENT_XML1 доступен только в том случае, если у вас есть PHP 5.4.0 или выше.
htmlspecialchars() с этими параметрами заменяет следующие символы:
- & (амперсанд) становится &
- » (двойная кавычка) становится "
- ‘ (одинарная кавычка)
- < (меньше) становится <
- > (больше) становится >
Вы можете получить таблицу переводов, используя get_html_translation_table() .
С трудом справлялись с проблемой XML-сущности, решайте таким образом:
htmlspecialchars($value, ENT_QUOTES, 'UTF-8')
Чтобы иметь действительный окончательный XML-текст, вам нужно убрать все сущности XML и написать текст, написанный в той же кодировке, что и инструкция обработки XML-документа, указывая его («кодирование» в строке
Тем не менее, во многих ситуациях просто избегать ввода с помощью htmlspecialchars может привести к двойным закодированным объектам (например, é , станет é ), поэтому я предлагаю сначала декодировать html-объекты:
Теперь вам нужно убедиться, что все символы с акцентом действительны в кодировке XML-документа. Я настоятельно рекомендую всегда кодировать вывод XML в UTF-8, поскольку не все синтаксические анализаторы XML уважают кодировку XML-обработки документов. Если ваш вход может возникнуть из другой кодировки, попробуйте использовать utf8_encode() .
Есть специальный случай, который может быть вызван одним из этих кодировок: ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252 и KOI8-R – PHP обрабатывает их все но есть некоторые незначительные различия в них – некоторые из которых даже iconv() не могут справиться. Я мог бы решить эту проблему только путем дополнения поведения utf8_encode() :
function encode_utf8($s) < $cp1252_map = array( "\xc2\x80" =>"\xe2\x82\xac", "\xc2\x82" => "\xe2\x80\x9a", "\xc2\x83" => "\xc6\x92", "\xc2\x84" => "\xe2\x80\x9e", "\xc2\x85" => "\xe2\x80\xa6", "\xc2\x86" => "\xe2\x80\xa0", "\xc2\x87" => "\xe2\x80\xa1", "\xc2\x88" => "\xcb\x86", "\xc2\x89" => "\xe2\x80\xb0", "\xc2\x8a" => "\xc5\xa0", "\xc2\x8b" => "\xe2\x80\xb9", "\xc2\x8c" => "\xc5\x92", "\xc2\x8e" => "\xc5\xbd", "\xc2\x91" => "\xe2\x80\x98", "\xc2\x92" => "\xe2\x80\x99", "\xc2\x93" => "\xe2\x80\x9c", "\xc2\x94" => "\xe2\x80\x9d", "\xc2\x95" => "\xe2\x80\xa2", "\xc2\x96" => "\xe2\x80\x93", "\xc2\x97" => "\xe2\x80\x94", "\xc2\x98" => "\xcb\x9c", "\xc2\x99" => "\xe2\x84\xa2", "\xc2\x9a" => "\xc5\xa1", "\xc2\x9b" => "\xe2\x80\xba", "\xc2\x9c" => "\xc5\x93", "\xc2\x9e" => "\xc5\xbe", "\xc2\x9f" => "\xc5\xb8" ); $s=strtr(utf8_encode($s), $cp1252_map); return $s; >
Если вам нужен правильный вывод xml, Simplexml – это путь:
Правильное экранирование – это способ получить правильный вывод XML, но вам нужно обрабатывать различие по атрибутам и элементам . (То есть ответ Томаса неверен).
Я написал / украл некоторый код Java некоторое время назад, который различает атрибут и escape-элемент. Причина в том, что синтаксический анализатор XML рассматривает все специальные пробелы, особенно в атрибутах.
Это должно быть тривиально, чтобы передать это на PHP (вы можете использовать подход Томаса Янчика с вышеупомянутым соответствующим экранированием). Вам не нужно беспокоиться об экранировании расширенных объектов, если вы используете UTF-8 .
Если вы не хотите переносить мой код Java, вы можете посмотреть на XMLWriter, который основан на потоке и использует libxml, поэтому он должен быть очень эффективным.
Таким образом, все объекты (html / xml) экранированы, и вы можете поместить свою строку в теги XML
function replace_char($arr1) < $arr[]=preg_replace('>','>', $arr1); $arr[]=preg_replace('
На основе решения sadeghj для меня работал следующий код:
/** * @param $arr1 the single string that shall be masked * @return the resulting string with the masked characters */ function replace_char($arr1) < if (strpos ($arr1,'&')!== FALSE) < //test if the character appears $arr1=preg_replace('/&/','&', $arr1); // do this first >// just encode the if (strpos ($arr1,'>')!== FALSE) < $arr1=preg_replace('/>/','>', $arr1); > if (strpos ($arr1,' <')!== FALSE) < $arr1=preg_replace('/','<', $arr1); >if (strpos ($arr1,'"')!== FALSE) < $arr1=preg_replace('/"/','"', $arr1); >if (strpos ($arr1,'\'')!== FALSE) < $arr1=preg_replace('/\'/',''', $arr1); >return $arr1; >