|
|
|
| Встала задача разбора 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> <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;"> 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> <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;"> 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;"> </td>]
<td style="background: #EEEEEE; color: #000;">10:26:53</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+74959760916 </td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:02:45</td>
<td style="background: #EEEEEE; color: #000;"> </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;"> </td>
<td style="background: #EEEEEE; color: #000;">11:39:03</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+359448811324 </td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:01:52</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">€ 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>
Опять же, нужно выделенное, хотя такое можно выбрать и без регулярных выражений | |
|
|
|
|
|
|
|
для: Vpage
(30.11.2008 в 20:14)
| | например так
<pre><?
$txt = 'этот html';
preg_match_all('#:none">([^<]+)</a>[^>]+>([^<]+)</font>#i', $txt, $out, 2);
print_r($out);
?>
|
но это зависит от того есть-ли другие появления :none">
ато придётся цепляться ещё раньше за <td class="Main-Text">
строку </font> при желании можно убрать из Array[0]s массива $out | |
|
|
|
|
|
|
|
для: 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> <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;"> 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> <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;"> 0.167</td></tr>
';
preg_match_all("#href=\"/en/[^>]+>(.+?)</a>[^>]+>(.+?)</font></td><td[^>]+>(.+?)</td>#s",$t,$out);
unset($out[0]);
print_r($out);
?>
|
Данные из массива, надеюсь рассортируете. | |
|
|
|
|
|
|
|
для: 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;"> </td>]
<td style="background: #EEEEEE; color: #000;">10:26:53</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+74959760916 </td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:02:45</td>
<td style="background: #EEEEEE; color: #000;"> </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;"> </td>
<td style="background: #EEEEEE; color: #000;">11:39:03</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap>+359448811324 </td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:01:52</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">€ 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[^>]+>(?! | |<a.*</a>)(.+?)</td>#is', $t, $out);
unset($out[0]);
print_r($out);
?>
|
| |
|
|
|
|
|
|
|
для: AcidTrash
(30.11.2008 в 21:23)
| | Странно, но вот такое парсится не совсем :-(
<td style="background: #EEEEEE; color: #000;"><nobr>2008-12-02</nobr></td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="background: #EEEEEE; color: #000;">17:11:32</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;" nowrap> from +380572673419 to +46738345405</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">00:16:04</td>
<td style="background: #EEEEEE; color: #000;"> </td>
<td style="text-align: left; background: #EEEEEE; color: #000;">€ 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>
выделенное не попадает :-(
Может можно что-то подправить? | |
|
|
|
|
|
|
|
для: Vpage
(02.12.2008 в 19:40)
| |
preg_match_all('#<td[^>]+>(?! |<a.*</a>)(.+?)</td>#is', $t, $out);
|
| |
|
|
|
|
|
|
|
для: Vpage
(30.11.2008 в 20:14)
| |
<?
$txt = str_replace(array('€', ' ', ' '), '', strip_tags($txt, '<B><O><T>'));
|
:) | |
|
|
|
|
|
|
|
для: xx77
(30.11.2008 в 21:38)
| | Все просто супер! Спасибо огромное! Блин, надо учить регулярные выражения! Это круто! | |
|
|
|
|
|
|
|
для: Vpage
(02.12.2008 в 13:53)
| | Это из-за пробела который проверяется как ненужный сразу после <td ....>
точнее (?! | |<a.*</a>) - это утверждение
, идущее сразу после нахождения открывающего тега, утверждает что
с этого места дальше не должно быть этих подстрок перечисленных через |
и пробел одна из этих подстрок.
С этим что-то и нужно делать .)
// upd
уже поправили :) | |
|
|
|
|
|
|
|
для: xx77
(02.12.2008 в 21:33)
| | >Это из-за пробела который проверяется как ненужный сразу после <td ....>
Так, соответственно он и проверялся по строке:
<td style="text-align: left; background: #EEEEEE; color: #000;"> </td></tr>
из первого поста автора.
P.S. Один пробел, он и воспринимается как один пробел и не обязательно писать мнемоники, а если больше, только мнемоники. | |
|
|
|
|
|
|
|
для: 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>]" в первом посте .) | |
|
|
|