Я отвечаю на вызов AJAX, отправив ему XML-документ через эхо-файлы PHP. Чтобы сформировать этот документ XML, я просматриваю записи базы данных. Проблема в том, что база данных включает записи, в которых есть символы «<». Естественно, браузер бросает ошибку в этом конкретном месте. Как это можно зафиксировать?
htmlspecialchars
этих символов с помощью htmlspecialchars
или, возможно, более подходящим образом, используя библиотеку для создания XML-документов, таких как DOMDocument или XMLWriter .
Другой альтернативой было бы использование разделов CDATA, но тогда вам придется искать случаи ]]>
.
Также учтите, что вы должны уважать кодировку, которую вы определяете для XML-документа (по умолчанию UTF-8).
Начиная с PHP 5.4 вы можете использовать:
htmlspecialchars($string, ENT_XML1);
Вы должны указать кодировку, такую как:
htmlspecialchars($string, ENT_XML1, 'UTF-8');
Обратите внимание, что вышесказанное преобразует только:
&
to &
<
>
to >
Если вы хотите избежать текста для использования в атрибуте, заключенном в двойные кавычки:
htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8');
преобразует "
в» в дополнение к &
, <
и >
.
И если ваши атрибуты заключены в одинарные кавычки:
htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8');
преобразует '
в '
в дополнение к &
, <
, >
и "
.
(Конечно, вы можете использовать это даже вне атрибутов).
См. Руководство для htmlspecialchars .
1) Вы можете обернуть свой текст как CDATA следующим образом:
<mytag> <![CDATA[Your text goes here. Btw: 5<6 and 6>5]]> </mytag>
см. http://www.w3schools.com/xml/xml_cdata.asp
2) Как уже кто-то сказал: «Выбери эти символы». Например, так:
5<6 and 6>5
Если это вообще возможно, всегда полезно создать свой XML с использованием классов XML, а не манипулировать строкой – одно из преимуществ заключается в том, что классы будут автоматически выходить из символов по мере необходимости.
Попробуй это:
$str = htmlentities($str,ENT_QUOTES,'UTF-8');
Итак, после фильтрации ваших данных с помощью функции htmlentities()
вы можете использовать данные в теге XML, например:
<mytag>$str</mytag>
Добавление этого в случае, если это помогает кому-то.
Поскольку я работаю с японскими символами, кодировка также была установлена соответствующим образом. Однако время от времени я обнаружил, что htmlentities
и htmlspecialchars
недостаточно.
Некоторые пользовательские входы содержат специальные символы, которые не разделяются вышеуказанными функциями. В таких случаях я должен это сделать:
preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string))
Это также устранит некоторые xml-unsafe
управляющие символы, такие как Null character
или EOT
. Вы можете использовать эту таблицу, чтобы определить, какие символы вы хотите пропустить.