Я отвечаю на вызов AJAX, отправив XML-документ через echo. Чтобы сформировать этот документ XML, я просматриваю записи базы данных. Проблема заключается в том, что база данных включает в себя записи, которые имеют '<' символы в них. Естественно, браузер бросает ошибку в этом конкретном месте. Как это можно зафиксировать?
Как сделать строки "безопасными для XML"?
Ответ 1
Избегая этих символов с htmlspecialchars
или, возможно, более подходящим образом, используя библиотеку для создания XML-документов, например DOMDocument или XMLWriter.
Другой альтернативой может быть использование разделов CDATA, но тогда вам придется искать вхождения ]]>
.
Также учтите, что вы должны соблюдать кодировку, которую вы определяете для документа XML (по умолчанию UTF-8).
Ответ 2
С PHP 5.4 вы можете использовать:
htmlspecialchars($string, ENT_XML1);
Необходимо указать кодировку, например:
htmlspecialchars($string, ENT_XML1, 'UTF-8');
Update
Обратите внимание, что вышесказанное преобразует только:
-
&
to&
-
<
to<
-
>
to>
Если вы хотите избежать текста для использования в атрибуте, заключенном в двойные кавычки:
htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8');
преобразует "
в "
в дополнение к &
, <
и >
.
И если ваши атрибуты заключены в одинарные кавычки:
htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8');
преобразует '
в '
в дополнение к &
, <
, >
и "
.
(Конечно, вы можете использовать это даже вне атрибутов).
Смотрите ручную запись для htmlspecialchars.
Ответ 3
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
Ответ 4
Если это вообще возможно, всегда полезно создать свой XML с использованием классов XML, а не манипулировать строками - одним из преимуществ является то, что классы будут автоматически выходить из символов по мере необходимости.
Ответ 5
Попробуйте следующее:
$str = htmlentities($str,ENT_QUOTES,'UTF-8');
Итак, после фильтрации ваших данных с помощью функции htmlentities()
вы можете использовать данные в теге XML, например:
<mytag>$str</mytag>
Ответ 6
Добавление этого в случае, если это помогает кому-то.
Поскольку я работаю с японскими символами, кодировка также была установлена соответствующим образом. Однако время от времени я обнаружил, что htmlentities
и htmlspecialchars
недостаточно.
Некоторые пользовательские входы содержат специальные символы, которые не разделяются вышеуказанными функциями. В таких случаях я должен это сделать:
preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string))
Это также удалит определенные управляющие символы xml-unsafe
, такие как Null character
или EOT
. Вы можете использовать эту таблицу, чтобы определить, какие символы вы хотите пропустить.