Я отвечаю на вызов 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 . Вы можете использовать эту таблицу, чтобы определить, какие символы вы хотите пропустить.