php output xml создает ошибку синтаксического анализа "& 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 решения безопасными? Что лучше?

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

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

Как вы получили &rsquo; от пользователя? Если он буквально набрал его, вы неправильно обрабатываете входные данные – например, вы должны убежать & to &amp; , Если вы помещаете объект (возможно, вместо некоторого апострофа), либо определяете его в DTD ( <!ENTITY rsquo "&x2019;"> ), либо записываете его с помощью числовой нотации ( &#x2019; ), поскольку почти каждый из названных объектов является частью HTML. XML определяет только несколько базовых, как указал Гумбо.

EDIT, основанный на дополнениях к вопросу:

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

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

 html_entity_decode($string, ENT_QUOTES, 'UTF-8') 

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

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

С сайта w3schools :

Символы типа «<» и «&» являются незаконными в элементах XML.

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

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

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

Синтаксический анализатор игнорирует все содержимое раздела CDATA.

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

Самый простой способ справиться с этим – сохранить все исходные данные (т. htmlentities Не разбираться с 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); 

У меня была аналогичная проблема, что данные, которые мне нужно было добавить в XML, уже были возвращены моим кодом как htmlentities () (а не в базе данных, подобной этой).

я использовал:

 $doc = new DOMDocument('1.0','utf-8'); $element = $doc->createElement("content"); $element->appendChild($doc->createElement('string', htmlspecialchars(html_entity_decode($string, ENT_QUOTES, 'UTF-8'), ENT_XML1, 'UTF-8'))); $doc->appendChild($element); 

или если это еще не было в htmlentities (), то только нижеследующее должно работать

 $doc = new DOMDocument('1.0','utf-8'); $element = $doc->createElement("content"); $element->appendChild($doc->createElement('string', htmlspecialchars($string, ENT_XML1, 'UTF-8'))); $doc->appendChild($element); 

в основном с использованием htmlspecialchars с ENT_XML1 следует получить пользовательские вмененные данные в безопасные данные XML (и работает отлично для меня):

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

Использование htmlspecialchars () решит вашу проблему. См. Сообщение ниже.

PHP. Является ли htmlentities () достаточным для создания xml-безопасных значений?

 htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8'); 

Должен это делать.