2010-06-29 2 views
4

Есть ли какая-либо функция, которую я могу использовать для синтаксического анализа любой строки, чтобы убедиться, что она не вызовет проблемы с анализом xml? У меня есть php-скрипт, выводящий XML-файл с содержимым, полученным из форм.php output 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 решения безопасны? Что лучше?

Спасибо, извините за недопущение этой информации раньше.

+1

Я бы использовал синтаксический анализатор XML, чтобы увидеть, не сидит ли парсер XML на входе. – Gumbo

+0

@Kobi: Точно. – Gumbo

+0

Проблема заключается в том, что XML знает только несколько сущностей, которые фактически указывают ссылки на символы. (См. Http://www.w3.org/TR/xml/#sec-predefined-ent) – Gumbo

ответ

8

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

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

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

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

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

+0

благодарю Krab. Что я делаю с пользовательскими вводами, это их можно проделать через: 'htmlentities ($ _ POST ['content'], ENT_QUOTES, 'UTF-8');'. предложение sleepynate использовать html_entity_decode исправленный '’', поскольку он преобразовал его обратно .. но тогда у меня были проблемы с' & '. Что мне делать? Является ли это 'htmlspecialchars (html_entity_decode ($ content, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8')' достаточным для обеспечения того, чтобы будущие пользовательские входы не вызывали проблем с моим xml-файлом? Мне нужно, чтобы xml-файл был безошибочным, так как функция javascript анализирует его. – Lyon

+0

Есть ли причина, по которой вы должны использовать htmlentities(), а не htmlspecialchars()? – Krab

+0

никакой конкретной причины на самом деле..может ли htmlspecialchars() достаточно обработать все пользовательские входы? когда можно было бы использовать htmlentities()? – Lyon

4
html_entity_decode($string, ENT_QUOTES, 'UTF-8') 
+0

, который устраняет ошибку '’', но вызывает ошибки' & '?Если я изменяю '&' на '&', он исправил ошибку, но как я могу правильно декодировать все? – Lyon

+0

@Lyon: Может быть, вы должны показать нам, что вы на самом деле делаете. – Gumbo

+0

Да. Я выводю в utf-8. мой XML-результат начинается с 'echo ''." \ n ";' благодарит – Lyon

3

Закрепите значение в тегах CDATA.

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

От w3schools site:

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

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

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

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

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

+0

Это хорошее решение, хотя я содрогаюсь, когда необработанный CDATA используется где-то еще в коде дальше по строке (например, чтобы попасть в базу данных), хотя это напрямую не связано с проблемой. – sleepynate

+0

Привет, мир!]]> – porges

3

Проблема заключается в том, что ваша функция htmlentities делает то, что она должна - генерирует объекты HTML из символов. Затем вы вставляете их в XML-документ, который не имеет определенных объектов HTML (такие как &rsquo; являются специфичными для 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); 
+0

спасибо Поргес! В настоящее время я просто эхо из XML-файла. Я буду использовать PHP-функции XML для правильного создания XML-документа. :) – Lyon

1

У меня была аналогичная проблема, что данные мне нужно, чтобы добавить к 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'); 
0
htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8'); 

Должно быть сделано.

Смежные вопросы