выходной xml php производит ошибку анализа “&rsquo”;

Есть ли какая-либо функция, которую я могу использовать для парсинга какой-либо строки, чтобы гарантировать, что она не вызовет xml парсинг проблем? У меня есть сценарий PHP, производящий XML-файл с содержанием, полученным из форм.

Вещь кроме обычных строковых проверок от формы php, часть пользовательского текста вызывает xml ошибки анализа. Я сталкиваюсь с этим"’"в частности. Это - ошибка, которую я получаю Entity 'rsquo' not defined

У кого-либо есть опыт в кодировании текста для вывода xml?

Спасибо!


Некоторое разъяснение: я произвожу содержание от форм в XML-файле, который впоследствии анализируется JavaScript.

Я обрабатываю все исходные данные формы с: htmlentities(trim($_POST['content']), ENT_QUOTES, 'UTF-8');

Когда я хочу произвести это содержание в XML-файл, как я должен закодировать его таким образом, что оно не подбросит xml ошибки анализа?

До сих пор следующие 2 работы решений:

1) echo '<content><![CDATA['.$content.']]></content>';

2) echo '<content>'.htmlspecialchars(html_entity_decode($content, ENT_QUOTES, 'UTF-8'),ENT_QUOTES, 'UTF-8').'</content>'."\n";

Безопасны вышеупомянутые 2 решения? Который лучше?

Спасибо, извините за то, что не была предоставлена эта информация ранее.

5
задан Lyon 29 June 2010 в 16:39
поделиться

4 ответа

Вы неправильно поняли - не ищите парсер, который не выдает ошибок. Вместо этого попробуйте иметь правильно сформированный xml.

Как вы получили от пользователя? Если он буквально набрал его, значит, вы неправильно обрабатываете ввод - например, вам следует выйти & на & . Если это вы поместили объект туда (возможно, вместо какого-либо апострофа), либо определите его в DTD ( ) или запишите его, используя числовое обозначение ( ] '), потому что почти все названные объекты являются частью HTML. Как указал Гамбо, XML определяет только несколько основных.

РЕДАКТИРОВАТЬ на основе дополнений к вопросу:

  • В № 1 вы экранируете содержимое таким образом, что если пользователь вводит в ]]> <°)))> <, у вас есть проблема.
  • В № 2, вы выполняете кодирование и декодирование, результатом которых является исходное значение $ content. декодирование не требуется (если вы не ожидаете, что пользователи будут публиковать значения вроде & , которые следует интерпретировать как &).

Если вы используете htmlspecialchars () с ENT_QUOTES, все должно быть в порядке, но посмотрите , как это делает Drupal .

7
ответ дан 18 December 2019 в 08:26
поделиться
html_entity_decode($string, ENT_QUOTES, 'UTF-8')
4
ответ дан 18 December 2019 в 08:26
поделиться

Заключите значение в теги CDATA.

<message><![CDATA[&rsquo;]]></message>

С сайта w3schools :

Такие символы, как «<» и «&», недопустимы в элементах XML.

«<» вызовет ошибку, поскольку синтаксический анализатор интерпретирует ее как начало нового элемента.

«&» вызовет ошибку, потому что синтаксический анализатор интерпретирует ее как начало символьной сущности.

Некоторый текст, например код JavaScript, содержит много символов «<» или «&». Во избежание ошибок код скрипта можно определить как CDATA.

Все, что находится внутри раздела CDATA, игнорируется анализатором.

4
ответ дан 18 December 2019 в 08:26
поделиться

Проблема в том, что ваша функция htmlentities делает то, что должна - генерирует объекты HTML из символов. Затем вы вставляете их в XML-документ, в котором не определены объекты HTML (например, специфичны для HTML).

Самый простой способ справиться с этим - сохранить весь ввод в исходном виде (т.е. не анализировать с помощью htmlentities ), а затем сгенерировать свой XML с помощью функций PHP XML.

Это гарантирует, что весь текст правильно закодирован, и ваш XML будет правильно сформирован.

Пример:

$user_input = "...<>&'";

$doc = new DOMDocument('1.0','utf-8');

$element = $doc->createElement("content");
$element->appendChild($doc->createTextNode($user_input));

$doc->appendChild($element);
3
ответ дан 18 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: