Използване на регулярен израз с 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
stema, благодаря за това. само един въпрос, успях да вкарам първата стойност на CDATA в масива. Но както можете да видите от XML, има редица други сегменти на CDATA. как да управлявам тези? - person Stephen; 28.04.2011
comment
@Stephen, не знам много добре php, но има функция preg_match_all, опитайте да използвате това вместо preg_match. Според тази документация трябва да прави това, което искате . - person stema; 28.04.2011