Regex для двоеточия в теге xml при разборе парсинга с помощью php и simplexml_load_string

В соответствии с моим последним вопросом , если у вас есть строка, которая неверна в XML-файле, вы можете извлечь содержимое, используя preg_replace_callback (), чтобы удалить сломанные элементы.

Точкой этой функции является не синтаксический анализ xml с регулярным выражением ( плохая идея ), а попытка найти xml, который не анализирует и где он терпит неудачу, чтобы мы могли помечать статьи, которые не были правильно отформатированы перед отправкой вне. Это часть набора инструментов для очистки контента перед доставкой. Я тестирую его на известных искаженных общедоступных RSS-адресах, а также на внутренних, чтобы узнать, подходит ли он для ряда ситуаций. Обратный вызов возвращает целое число для узла, который не прошел. Если он пройдет после этого, мы можем сообщить индекс статьи, а затем попытаться использовать DOMDocument, чтобы попытаться исправить html и повторить попытку. Если это не удастся, мы сообщим об этом как о критическом, иначе мы вернем описание статьи и содержимое статьи в базу данных, отметив ее как измененную до доставки.

Затем вы можете взять сломанные элементы и запустить их через DOMDocument, чтобы лучше форматировать их для возврата в файл XML.

Однако я зациклился на том, как сделать этот пример ниже, кроме false:

Пример XML:

<item> <content:encoded><![CDATA[ This is the text with odd characters that are killing simplexml_load_string() (doesn't recover) and breaking (although recoverable) DOMDocument ]]></content:encoded> </item> 

Если я использую следующий PHP, я могу извлечь узел описания и преобразовать его из:

 <description><![CDATA[ This is some description text with the same problem ]]></description> 

в

 <description>0</description> 

PHP:

 preg_replace_callback( '/<description>(.*)<\/description>/', **// add msU modifiers to fix below** 'node_tidy::callback_description', $xml ); 

 private function callback_description($matches=false) { if(false !== $matches) { $this->arrDescriptions[] = $matches[1]; return '<description>'.$this->indexDescriptions++.'</description>'; } else { return false; } } 

Однако, когда я пытаюсь сделать то же самое с content:encoded узлы, он возвращает false. Вот связанная функция:

 private function callback_content_encoded($matches=false) { if(false !== $matches) { $this->arrContentEncoded[] = $matches[1]; return '<content:encoded>'.$this->indexContentEncoded++.'</content:encoded>'; } else { return false; } } 

Используя прямое регулярное выражение, чтобы проверить, является ли это двоеточие, я использовал это:

 <?php $string = '<content:encoded>this is some text</content:encoded>'; preg_match('/<content\:encoded>(.*)<\/content\:encoded>/',$string,$matches); echo '<pre>'; print_r($matches); echo '</pre>'; ?> 

Тем не менее, это не печатало ожидаемый массив с добавлением \: . Может ли кто-нибудь указать мне в правильном направлении для непонимания здесь?

Большое спасибо!

UPDATE: Вот пример фрагмента реального xml, который не работает, как указано @Florent.

http://pastebin.com/7z0f3MJP

UPDATE: это регулярное выражение соответствует требуемому контенту:

 preg_match('/<content\:encoded>(.*)<\/content\:encoded>/msU',$string,$matches); 

Модификаторы m и s и U объясняются здесь лучше: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

Я забыл рассмотреть эти модификаторы.

Результаты теперь возвращаются этим регулярным выражением, включая исходную проблему, поэтому теперь это можно решить.