Как сделать строки «безопасными для XML»?

Я отвечаю на вызов 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 &amp;
  • &lt;
  • > to &gt;

Если вы хотите избежать текста для использования в атрибуте, заключенном в двойные кавычки:

 htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8'); 

преобразует " в» в дополнение к & , < и > .


И если ваши атрибуты заключены в одинарные кавычки:

 htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8'); 

преобразует ' в &apos; в дополнение к & , < , > и " .

(Конечно, вы можете использовать это даже вне атрибутов).


См. Руководство для 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&lt;6 and 6&gt;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 . Вы можете использовать эту таблицу, чтобы определить, какие символы вы хотите пропустить.