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

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

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

 

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

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

тема: Парсинг HTML блока
 
 автор: SpiLLeR   (01.12.2008 в 21:52)   письмо автору
 
 

Помогите распарсить вот такой блок:
<span id="infotext"><p>Планировочное решение этого дома основано на размещении всех необходимых помещений дома на разных уровнях. Это достигается за счет центрального расположения внутренней лестницы. Непосредственно при входе есть жилая комната, несколько ниже – вход в гараж и в блок с санузлом, душем и котельной. Здесь же предусмотрен хозяйственный выход на участок. На двух уровнях второго этажа находятся гостиная и кухня-столовая. На промежуточном уровне – спальня. В <span class="cont2"><s>мансардном<span><table width="100%"><tbody><tr><td valign="top">
<a href="http://www.homeplans.ru/practice/index.php?info=goods_window"><img src="http://www.homeplans.ru/img/articles/033668/tips.jpg" title="Окна на крыше" alt="Окна на крыше" width="60" height="60"></a></td>
<td><a href="http://www.homeplans.ru/practice/index.php?info=goods_window"><h2>Окна на крыше</h2><p>Какие «фокусы» не пройдут с традиционными вертикальными oкнами в вашей мансарде.</p>

<p style="color: green;" align="right">Подробнее &gt;&gt; &nbsp;</p></a></td></tr><tr><td colspan="2"><p style="margin: 5px 0px 0px 5px;">
<a href="http://www.velux.ru/?WT.mc_id=ru_solution&amp;WT.mc_ad=sponsorlink&amp;WT.mc_host=homeplans.ru" target="_blank">www.velux.ru</a></p></td></tr></tbody></table></span></s> </span>этаже находятся две спальни и хозяйственные помещения. В доме помимо камина есть печь, которая предназначена не только для обогрева, но и для приготовления пищи.</p></span>


Между тэгами <span id="infotext"></span> может быть любое количество тэгов... или совсем не быть.

Просто:
$pattern = '#<span id=\"infotext\">(.*)</span>#';
preg_match_all($pattern, $content, $matches);
Есс-но не получается.

Заранее всем, Спасибо!

  Ответить  
 
 автор: xx77   (02.12.2008 в 13:46)   письмо автору
 
   для: SpiLLeR   (01.12.2008 в 21:52)
 

Непонятно что вы пытаетесь получить из текста,
если фрагмент до первого </span>, то измените (.*) на (.*?)

если хотите получить вместе с вложенными элементами, то придётся как-нибудь
применить рекурсию в шаблоне , например так
<?
$pattern 
'#<span(?(1)[^>]*| id="infotext")(>)(?:(?>(?!</?span).[^<]*)+|(?R))*</span[^>]*>#s';


preg_match_all($pattern$content$matches);

print_r($matches);
?>

или предусмотреть ограниченно-вложенные элементы.
Но усложнение замедляет

  Ответить  
 
 автор: SpiLLeR   (03.12.2008 в 01:16)   письмо автору
 
   для: xx77   (02.12.2008 в 13:46)
 

Я хочу получить текст между <span id="infotext"></span> необязательно даже с внутреними тегам, главное текст.

  Ответить  
 
 автор: AcidTrash   (03.12.2008 в 21:22)   письмо автору
 
   для: SpiLLeR   (03.12.2008 в 01:16)
 

Короче, не реально, сделать это правильно.
В вашем примере span`ов х...а туча, а также возможно в реальной странице еще больше и абсолютно не понятно от чего отталкиваться.

PS У этого сайта нет rss? Возможно от туда легче было бы взять информацию.

  Ответить  
 
 автор: SpiLLeR   (04.12.2008 в 13:21)   письмо автору
 
   для: AcidTrash   (03.12.2008 в 21:22)
 

RSS есть, но там только последние 20 объектов.
Эти спаны внутри оказывается контекстная реклама и появляется редко.
Вот код не много больше, может так будет от чего оттолкнутся:
<td align="right"><p class="txt"><a href="#wplan">
<img src="http://www.homeplans.ru/img/icons/view.gif" alt="увеличить" width="21" align="top" border="0" height="21"></a> <a href="#wplan">Посмотреть планы</a></p></td></tr></tbody></table><span id="infotext"><p>Планировочное решение этого дома основано на размещении всех необходимых помещений дома на разных уровнях. Это достигается за счет центрального расположения внутренней лестницы. Непосредственно при входе есть жилая комната, несколько ниже – вход в гараж и в блок с санузлом, душем и котельной. Здесь же предусмотрен хозяйственный выход на участок. На двух уровнях второго этажа находятся гостиная и кухня-столовая. На промежуточном уровне – спальня. В мансардном этаже находятся две спальни и хозяйственные помещения. В доме помимо камина есть печь, которая предназначена не только для обогрева, но и для приготовления пищи.</p></span>
<div style="width: 475px;">

  Ответить  
 
 автор: AcidTrash   (04.12.2008 в 16:53)   письмо автору
 
   для: SpiLLeR   (04.12.2008 в 13:21)
 

Добавить модификатор s, чтобы переносы строк тоже считались символами при использовании метасимвола точки.
$pattern = '#<span id=\"infotext\">(.*)</span>#s'; 

  Ответить  
 
 автор: xx77   (04.12.2008 в 17:23)   письмо автору
 
   для: SpiLLeR   (04.12.2008 в 13:21)
 

'#<span id="infotext"><p>((?>(?!<span><table|</p>).[^<]*)*)(?:<span><table.+?</table></span>)?(.*?)</p></span>#s'

Можно сделать две подстроки совпадения , здесь первая до рекламы - жадная,
вторая ,нежадная, может быть пустой

  Ответить  
Rambler's Top100
вверх

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