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

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

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

 

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

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

тема: Опять парсинг тега
 
 автор: Vpage   (30.11.2008 в 20:14)   письмо автору
 
 

Встала задача разбора html тегов. Начал читать материалы на эту тему и понял, что мне нужно использовать регулярные выражения. Хорошо, что нашел этот форум. Смотрю, люди тут такое вытворяют..... Восхищен!!! Я, пока так не могу :( Может поможете. Есть html файл, где идут строки вида

<tr><td class="Main-Text"><a href="/en/callingrates/landline/cheap-calls-albania.html" style="color:black;font-weight:normal;text-decoration:none">Albania</a>&nbsp;&nbsp;<font size=1>(Landline)</font></td><td class="e" style="text-align:right;font-size:12px;;width:80px;">0.080</td><td class="i" style="text-align:right;font-size:12px;;width:80px; color: #C0C0C0;">&nbsp;&nbsp;0.095</td></tr>

<tr><td class="Main-Text"><a href="/en/callingrates/mobile/cheap-calls-albania.html" style="color:black;font-weight:normal;text-decoration:none">Albania</a>&nbsp;&nbsp;<font size=1>(Mobile)</font></td><td class="e" style="text-align:right;font-size:12px;;width:80px;">0.140</td><td class="i" style="text-align:right;font-size:12px;;width:80px; color: #C0C0C0;">&nbsp;&nbsp;0.167</td></tr>

Нужно получить выделенную информацию.

А еще лучше, что бы первая часть была вида Albania (Mobile), но это уже не сложно

И в догонку, извините за наглость.

Вот часть кода

<tr>
<td style="background: #EEEEEE; color: #000;"><nobr>2008-11-24</nobr></td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>]
<td style="background: #EEEEEE; color: #000;">10:26:53</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+74959760916 </td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:02:45</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;"><b>FREE!</b></td>
<td style="text-align: left; background: #EEEEEE; color: #000;"> </td></tr>
<tr>
<td style="background: #EEEEEE; color: #000;"><nobr>2008-11-20</nobr></td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="background: #EEEEEE; color: #000;">11:39:03</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+359448811324 </td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:01:52</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">&euro;&nbsp;0.360</td>
<td style="text-align: left; background: #EEEEEE; color: #000;"><a href="callinfo.php?type=39"><img src="questionmark.gif" border=0></a> </td></tr>

Опять же, нужно выделенное, хотя такое можно выбрать и без регулярных выражений

  Ответить  
 
 автор: xx77   (30.11.2008 в 20:39)   письмо автору
 
   для: Vpage   (30.11.2008 в 20:14)
 

например так
<pre><?
$txt 
'этот html';
preg_match_all('#:none">([^<]+)</a>[^>]+>([^<]+)</font>#i'$txt$out2);
print_r($out);
?>

но это зависит от того есть-ли другие появления :none">
ато придётся цепляться ещё раньше за <td class="Main-Text">

строку </font> при желании можно убрать из Array[0]s массива $out

  Ответить  
 
 автор: AcidTrash   (30.11.2008 в 20:40)   письмо автору
 
   для: Vpage   (30.11.2008 в 20:14)
 

>А еще лучше, что бы первая часть была вида Albania (Mobile), но это уже не сложно
Как-то так
<pre>
<?php
$t
='<tr><td class="Main-Text"><a href="/en/callingrates/landline/cheap-calls-albania.html" style="color:black;font-weight:normal;text-decoration:none">Albania</a>&nbsp;&nbsp;<font size=1>(Landline)</font></td><td class="e" style="text-align:right;font-size:12px;;width:80px;">0.080</td><td class="i" style="text-align:right;font-size:12px;;width:80px; color: #C0C0C0;">&nbsp;&nbsp;0.095</td></tr>

<tr><td class="Main-Text"><a href="/en/callingrates/mobile/cheap-calls-albania.html" style="color:black;font-weight:normal;text-decoration:none">Albania</a>&nbsp;&nbsp;<font size=1>(Mobile)</font></td><td class="e" style="text-align:right;font-size:12px;;width:80px;">0.140</td><td class="i" style="text-align:right;font-size:12px;;width:80px; color: #C0C0C0;">&nbsp;&nbsp;0.167</td></tr>
'
;
preg_match_all("#href=\"/en/[^>]+>(.+?)</a>[^>]+>(.+?)</font></td><td[^>]+>(.+?)</td>#s",$t,$out);
unset(
$out[0]);
print_r($out);
?>

Данные из массива, надеюсь рассортируете.

  Ответить  
 
 автор: AcidTrash   (30.11.2008 в 21:23)   письмо автору
 
   для: Vpage   (30.11.2008 в 20:14)
 

>И в догонку, извините за наглость.
>Вот часть кода

Как-то так
<pre>
<?php

$t
='<tr>
<td style="background: #EEEEEE; color: #000;"><nobr>2008-11-24</nobr></td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>]
<td style="background: #EEEEEE; color: #000;">10:26:53</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+74959760916 </td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:02:45</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;"><b>FREE!</b></td>
<td style="text-align: left; background: #EEEEEE; color: #000;"> </td></tr>
<tr>
<td style="background: #EEEEEE; color: #000;"><nobr>2008-11-20</nobr></td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="background: #EEEEEE; color: #000;">11:39:03</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+359448811324 </td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:01:52</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">&euro;&nbsp;0.360</td>
<td style="text-align: left; background: #EEEEEE; color: #000;"><a href="callinfo.php?type=39"><img src="questionmark.gif" border=0></a> </td></tr>
'
;
preg_match_all('#<td[^>]+>(?!&nbsp;| |<a.*</a>)(.+?)</td>#is'$t$out);
unset(
$out[0]);
print_r($out);
?>

  Ответить  
 
 автор: Vpage   (02.12.2008 в 19:40)   письмо автору
 
   для: AcidTrash   (30.11.2008 в 21:23)
 

Странно, но вот такое парсится не совсем :-(

<td style="background: #EEEEEE; color: #000;"><nobr>2008-12-02</nobr></td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="background: #EEEEEE; color: #000;">17:11:32</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap> from +380572673419 to +46738345405</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:16:04</td>
<td style="background: #EEEEEE; color: #000;">&nbsp;</td>
<td style="text-align: left; background: #EEEEEE; color: #000;">&euro;&nbsp;1.835</td>
<td style="text-align: left; background: #EEEEEE; color: #000;"><a href="callinfo.php?type=9"><img src="questionmark.gif" border=0></a> </td></tr>

выделенное не попадает :-(
Может можно что-то подправить?

  Ответить  
 
 автор: AcidTrash   (02.12.2008 в 21:25)   письмо автору
 
   для: Vpage   (02.12.2008 в 19:40)
 

preg_match_all('#<td[^>]+>(?!&nbsp;|<a.*</a>)(.+?)</td>#is', $t, $out); 

  Ответить  
 
 автор: xx77   (30.11.2008 в 21:38)   письмо автору
 
   для: Vpage   (30.11.2008 в 20:14)
 

<?
$txt 
str_replace(array('&euro;''&nbsp;'' '), ''strip_tags($txt'<B><O><T>'));

:)

  Ответить  
 
 автор: Vpage   (02.12.2008 в 13:53)   письмо автору
 
   для: xx77   (30.11.2008 в 21:38)
 

Все просто супер! Спасибо огромное! Блин, надо учить регулярные выражения! Это круто!

  Ответить  
 
 автор: xx77   (02.12.2008 в 21:33)   письмо автору
 
   для: Vpage   (02.12.2008 в 13:53)
 

Это из-за пробела который проверяется как ненужный сразу после <td ....>
точнее (?!&nbsp;| |<a.*</a>) - это утверждение
, идущее сразу после нахождения открывающего тега, утверждает что
с этого места дальше не должно быть этих подстрок перечисленных через |
и пробел одна из этих подстрок.
С этим что-то и нужно делать .)

// upd
уже поправили :)

  Ответить  
 
 автор: AcidTrash   (02.12.2008 в 21:37)   письмо автору
 
   для: xx77   (02.12.2008 в 21:33)
 

>Это из-за пробела который проверяется как ненужный сразу после <td ....>
Так, соответственно он и проверялся по строке:
<td style="text-align: left; background: #EEEEEE; color: #000;"> </td></tr>
из первого поста автора.

P.S. Один пробел, он и воспринимается как один пробел и не обязательно писать мнемоники, а если больше, только мнемоники.

  Ответить  
 
 автор: xx77   (03.12.2008 в 02:32)   письмо автору
 
   для: AcidTrash   (02.12.2008 в 21:37)
 

Незаметил , или просто не очень присматривался ,)
А так мне больше не понравилось то что это "]" почему-то попалось сразу после </td>,
и почему всё нужно без тегов , а это FREEEEE с тегами :)

да и так задачка не очень какая-то , хоть и тяжеловастенькая
, только что-то кривое вроде этого получается
'#>(?>\s+|\&\w{4}\;)*((?![\s&])[^<]+)(?:</[nobr]+>)?\s*</td>#is'


тут наверное скорее всего надо получить каждый <tr> отдельно,
типа такого
$subp  = '<td[^>]*>\s*(?:<[nobr]+>\s*)?([^<]+).*?<td[^>]*>.*?</td>\s*';
$pattern = "#<tr[^>]*>\s*${subp}${subp}${subp}${subp}${subp}#is";

preg_match_all($pattern, $txt, $out, 2);

но скорее всего помешает это "</td>]" в первом посте .)

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

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