Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Все между <item> и a</item>
 
 автор: Ziq   (28.07.2006 в 15:49)   письмо автору
 
 

Решил чуть-по-чуть учить рег. выр. Столкнулся с такой задачей: выбрать все между <item> и a</item> Делаю так

preg_match_all("|<item>(.*)</item>|iU", $rss, $arr);  

но ничего не получается. Помогите понять принцип.

Заранее ОГРОМНОЕ спасибо

   
 
 автор: Axxil   (28.07.2006 в 16:08)   письмо автору
 
   для: Ziq   (28.07.2006 в 15:49)
 

В вашем случае (.*) под шаблон попадают все символы
Надо таr:

preg_match_all("|<item>([^<]*)</item>|iU", $rss, $arr);  

Т.е. мы задаём условие: найди-ка нам батенька такую строчку чтобы сначала шло <item> потом любое число символов но не < а потом </item>. Если найдёшь запиши в массив $arr.

Надо сначала сформулировать на обычном языке, а потом очень легко это переводится на язык регулярных выражений.

   
 
 автор: Ziq   (28.07.2006 в 16:13)   письмо автору
 
   для: Axxil   (28.07.2006 в 16:08)
 

Не совсем так, потому что между item и <item> есть другие теги <title> <link> <description>

Да еще все время забываю что такое s и U

   
 
 автор: Axxil   (28.07.2006 в 16:45)   письмо автору
 
   для: Ziq   (28.07.2006 в 16:13)
 

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

PS А RSS ленты ИМХО проще разбирать с помощью XML функций php

   
 
 автор: Ziq   (28.07.2006 в 17:24)   письмо автору
 
   для: Axxil   (28.07.2006 в 16:45)
 

Примерчик?

   
 
 автор: Axxil   (28.07.2006 в 18:28)   письмо автору
 
   для: 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

   
 
 автор: Ziq   (28.07.2006 в 18:37)   письмо автору
 
   для: Axxil   (28.07.2006 в 18:28)
 

спасибо, попробую

   
 
 автор: beng-beng   (30.07.2006 в 00:35)   письмо автору
 
   для: Ziq   (28.07.2006 в 16:13)
 

Как вариант, любой текст между тегом item:

if (preg_match('|(?<=<item>)[^.]*(?=<\/item>)|i', $s, $r)) {
    echo $r[0];
}

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования