Использование регулярного выражения с XML

Я пытаюсь использовать регулярные выражения для извлечения CDATA из следующего XML-потока: http://www.patrickarundell.net/THREE-IE-FEED.asp

Мой код выглядит следующим образом:

$xml = file_get_contents('http://www.patrickarundell.net/THREE-IE-FEED.asp');

$arr = array();
preg_match('/(CDATA)(.*)/', $xml, $arr);
echo '<pre>';
    print_r($arr);
echo '</pre>';

Результат:

Array
(
    [0] => CDATA[
    [1] => CDATA
    [2] => [
)

Я знаю, что у меня неправильное регулярное выражение, но когда я пытаюсь выполнить следующее утверждение:

preg_match('/(<![CDATA[)(.*)/', $xml, $arr);

Я получаю сообщение об ошибке:

Предупреждение: preg_match() [function.preg-match]: компиляция не удалась: отсутствует завершение ] для класса символов по смещению 15

Я подумал, что это может дать мне подробности после квадратной скобки '[', что я и ищу.

Любая помощь приветствуется, я пробовал это в течение нескольких часов и не повезло.


person Stephen    schedule 27.04.2011    source источник
comment
Рассматривали ли вы парсер XML?   -  person BalusC    schedule 28.04.2011
comment
Да, я использую SimpleXMLElement для анализа остальной части файла, и это работает нормально. Это не доставляет мне никаких проблем. Но я не могу получить подробности в части CDATA, используя SimpleXMLElement. Если вы видите файл XML, фактическая деталь гороскопа находится под узлом «гороскоп». Когда я ссылаюсь на этот узел, он объединяет все данные.   -  person Stephen    schedule 28.04.2011


Ответы (1)


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

<!\[(CDATA)\[\s*(.*?)\s*\]\]>

Я протестировал его здесь, на regexr.

.*? — это нежадное совпадение, оно соответствует как можно меньшему числу совпадений, пока не найдет закрывающее ]]>.

person stema    schedule 28.04.2011
comment
Стема, спасибо за это. только один вопрос, мне удалось получить первое значение CDATA в массив. Но, как видно из XML, существует ряд других сегментов CDATA. как мне этим управлять? - person Stephen; 28.04.2011
comment
@Stephen, я не очень хорошо знаю php, но есть функция preg_match_all, попробуйте использовать ее вместо preg_match. Согласно этой документации, он должен делать то, что вы хотите . - person stema; 28.04.2011