Подтвердить что ты не робот

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

Я отвечаю на вызов AJAX, отправив XML-документ через echo. Чтобы сформировать этот документ XML, я просматриваю записи базы данных. Проблема заключается в том, что база данных включает в себя записи, которые имеют '<' символы в них. Естественно, браузер бросает ошибку в этом конкретном месте. Как это можно зафиксировать?

4b9b3361

Ответ 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 &amp;
  • < to &lt;
  • > to &gt;

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

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

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


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

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

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

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


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