Есть ли какая-либо функция, которую я могу использовать для синтаксического анализа любой строки, чтобы убедиться, что она не вызовет проблемы с анализом 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.
Как вы получили ’
от пользователя? Если он буквально набрал его, вы неправильно обрабатываете входные данные – например, вы должны убежать & to &
, Если вы помещаете объект (возможно, вместо некоторого апострофа), либо определяете его в DTD ( <!ENTITY rsquo "&x2019;">
), либо записываете его с помощью числовой нотации ( ’
), поскольку почти каждый из названных объектов является частью HTML. XML определяет только несколько базовых, как указал Гумбо.
EDIT, основанный на дополнениях к вопросу:
]]> <°)))><
, у вас есть проблема. &
которые должны интерпретироваться как &). Если вы используете htmlspecialchars () с ENT_QUOTES, это должно быть хорошо, но посмотрите, как это делает Drupal .
html_entity_decode($string, ENT_QUOTES, 'UTF-8')
Включите значение в тегах CDATA.
<message><![CDATA[’]]></message>
С сайта w3schools :
Символы типа «<» и «&» являются незаконными в элементах XML.
«<» генерирует ошибку, потому что парсер интерпретирует ее как начало нового элемента.
«&» генерирует ошибку, потому что синтаксический анализатор интерпретирует ее как начало символьной сущности.
Некоторые тексты, такие как код JavaScript, содержат много символов «<» или «&». Чтобы избежать ошибок, код сценария может быть определен как CDATA.
Синтаксический анализатор игнорирует все содержимое раздела CDATA.
Проблема в том, что ваша функция htmlentities
делает то, что ей нужно, – создавая объекты HTML из символов. Затем вы вставляете их в XML-документ, который не имеет определяемых HTML-объектов (такие вещи, как ’
специфичны для 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');
Должен это делать.