|
|
|
| Решил чуть-по-чуть учить рег. выр. Столкнулся с такой задачей: выбрать все между <item> и a</item> Делаю так
preg_match_all("|<item>(.*)</item>|iU", $rss, $arr);
|
но ничего не получается. Помогите понять принцип.
Заранее ОГРОМНОЕ спасибо | |
|
|
|
|
|
|
|
для: Ziq
(28.07.2006 в 15:49)
| | В вашем случае (.*) под шаблон попадают все символы
Надо таr:
preg_match_all("|<item>([^<]*)</item>|iU", $rss, $arr);
|
Т.е. мы задаём условие: найди-ка нам батенька такую строчку чтобы сначала шло <item> потом любое число символов но не < а потом </item>. Если найдёшь запиши в массив $arr.
Надо сначала сформулировать на обычном языке, а потом очень легко это переводится на язык регулярных выражений. | |
|
|
|
|
|
|
|
для: Axxil
(28.07.2006 в 16:08)
| | Не совсем так, потому что между item и <item> есть другие теги <title> <link> <description>
Да еще все время забываю что такое s и U | |
|
|
|
|
|
|
|
для: Ziq
(28.07.2006 в 16:13)
| | Тогда надо составлять более хитрое выражение исходя из конкретных условий задачи (какие теги, сколько что между тегами есть ли у них аттрибуты и т.д.)
PS А RSS ленты ИМХО проще разбирать с помощью XML функций php | |
|
|
|
|
|
|
|
для: Axxil
(28.07.2006 в 16:45)
| | Примерчик? | |
|
|
|
|
|
|
|
для: Ziq
(28.07.2006 в 17:24)
| | Например разбираем часть RSS файла новстей yandex (я так понимаю вы на нём учитесь):
<?php
function backbr(&$item){
$item = str_replace(' &br; ','<br>',$item);
}
$simple = '<item>
<title>ATI продолжит производство чипсеты для платформы Intel</title>
<link>http://news.yandex.ru/yandsearch?cl4url=business.compulenta.ru/279093/%3Fr1%3Dyandex%26r2%3Dnews&country=Russia</link>
<description>Николай Радовский PR-представитель ATI в странах СНГ заявил,
что компания будет продолжать производить чипсеты для материнских плат Intel.<br>
Он сказал, что nVidia стремится быть лидирующей инновационной
компаний в области графических процессоров и чипсетов как для платформы Intel, так и AMD.<br></description>
<pubDate>Fri, 28 Jul 2006 17:10:04 +0400</pubDate>
<guid>http://news.yandex.ru/yandsearch?cl4url=business.compulenta.ru/279093/%3Fr1%3Dyandex%26r2%3Dnews&country=Russia</guid>
</item>';
$simple = str_replace('<br>',' &br; ',$simple); // Убираем на время теги br чтоб не мешались
$tagArray=array('title','link','description','pubDate','guid'); // Все теги которые есть в отрывке
$pattern = '|<item>[^<]*';
foreach($tagArray as $tag){
$pattern .= '<'.$tag.'>([^<]*)</'.$tag.'>[^<]*';
}
$pattern .= '</item>|is'; // пишем шаблон
preg_match_all($pattern,$simple,$out);
array_walk($out,'backbr');//Возвращаем br на место
?>
|
Я так делаю. Но возможно есть методы проще...
Насчёт xml. С ходу пример кинуть не могу, но посмотрите расширение simple_xml или просто описания функций начинающихся с xml | |
|
|
|
|
|
|
|
для: Axxil
(28.07.2006 в 18:28)
| | спасибо, попробую | |
|
|
|
|
|
|
|
для: Ziq
(28.07.2006 в 16:13)
| | Как вариант, любой текст между тегом item:
if (preg_match('|(?<=<item>)[^.]*(?=<\/item>)|i', $s, $r)) {
echo $r[0];
}
|
| |
|
|
|