2010-11-15 4 views
1

Я пытаюсь проанализировать канал Atom на Twitter, но я столкнулся с этой странной проблемой. Я звоню preg_match_all с этой регулярным выражением строкой:PHP preg_match_all() не захватывает подгруппы

"|<entry>.*<title>(.*)</title>.*<published>(.*)</published>.*</entry>|xsU" 

Это соответствует всем записям в порядке, но захваченные подгруппы название/опубликовано не отображается в результатах (не массивы для захваченных подгрупп не будут созданы в результате объект).

Теперь к странной части, я стараюсь, чтобы захватить последний бит, а также:

"|<entry>.*<title>(.*)</title>.*<published>(.*)</published>(.*)</entry>|xsU" 

А теперь отлов работает. Я получаю заголовок и опубликованную дату и большой кусок конечных данных, которые мне не нужны.

Я попытался добавить строку non-capture «?:» В последнюю подгруппу, но затем захват снова перестает работать alltogether.

Так как я могу захватить данные, которые я хочу, без необходимости захватывать большой кусок нежелательных данных в конце?

+0

сообщение какой-то код, пожалуйста, – meagar

+2

[Не разобрать XML/HTML с регулярным выражением] (http://www.codinghorror.com/blog/2009/11 /parsing-html-the-cthulhu-way.html) ... – ircmaxell

ответ

1

Я рекомендую вам использовать DOM (или SimpleXML) для разбора RSS/Atom-каналов. Вы получите лучшие результаты, чем регулярные выражения.

Вот пример (с использованием SimpleXML):

$rss_feed = file_get_contents('http://stackoverflow.com/feeds/question/4187945'); 
$sxml = new SimpleXMLElement($rss_feed); 

$title = $sxml->entry[0]->title; 
echo $title; 
+0

'(. *)' не соответствует всем (и не соответствует ''). Был изменен модификатор ['U' Pattern] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php), поэтому он соответствует режиму UnGreedy ... В противном случае +1 для DOM/SimpleXML разбор ... – ircmaxell

+0

@ircmaxell: Вы правы. Я пропустил этот бит модификатора 'U'. Благодарю. – netcoder

+0

Я определенно использовал бы SimpleXml, если бы мог, но я хочу остаться ванилью и совместим с PHP4 (да, немного глупо я знаю ^^). Единственной альтернативой, которую я нашел, была xml_parser, которую я пробовал, но это закончилось большим количеством неуклюжего кода. Простое регулярное выражение выглядит гораздо более привлекательным для меня с меньшим влиянием требований PHP/модуля. – Arahman