Есть ли какая-либо функция, которую я могу использовать для парсинга какой-либо строки, чтобы гарантировать, что она не вызовет 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.
Как вы получили ’
от пользователя? Если он буквально набрал его, значит, вы неправильно обрабатываете ввод - например, вам следует выйти & на &
. Если это вы поместили объект туда (возможно, вместо какого-либо апострофа), либо определите его в DTD (
) или запишите его, используя числовое обозначение ( ] '
), потому что почти все названные объекты являются частью HTML. Как указал Гамбо, XML определяет только несколько основных.
РЕДАКТИРОВАТЬ на основе дополнений к вопросу:
]]> <°)))> <
, у вас есть проблема. &
, которые следует интерпретировать как &). Если вы используете htmlspecialchars () с ENT_QUOTES, все должно быть в порядке, но посмотрите , как это делает Drupal .
Заключите значение в теги CDATA.
<message><![CDATA[’]]></message>
С сайта w3schools :
Такие символы, как «<» и «&», недопустимы в элементах XML.
«<» вызовет ошибку, поскольку синтаксический анализатор интерпретирует ее как начало нового элемента.
«&» вызовет ошибку, потому что синтаксический анализатор интерпретирует ее как начало символьной сущности.
Некоторый текст, например код JavaScript, содержит много символов «<» или «&». Во избежание ошибок код скрипта можно определить как CDATA.
Все, что находится внутри раздела CDATA, игнорируется анализатором.
Проблема в том, что ваша функция 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);