[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярные выражения, парсинг другого сайта
John Cena
Доброе время суток! Второй день уже пытаюсь написать регулярное выражение для того что бы распарсить сайт.

Сайт выдает примерно вот такое:

<body>bla-bla<table class="table">То что мне нужно</table>bla-bla</body>

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

Заранее спасибо.



Спустя 9 минут, 39 секунд (13.07.2011 - 14:23) Winston написал(а):
Вот так нужно тебе ?

$str = '<body>bla-bla<table class="table">То что мне нужно</table>bla-bla</body>';
$str .= '<body>bla-bla<table class="table">Что мне еще нужно</table>bla-bla</body>';

preg_match_all("#(\"|')table\\1>(.*)</table>.*#iuU", $str, $matches);

echo '<pre>';
print_r($matches[2]);
echo '</pre>';

Спустя 2 часа, 40 минут, 21 секунда (13.07.2011 - 17:03) John Cena написал(а):
да, только оно пустые массивы водит(

Спустя 4 минуты, 25 секунд (13.07.2011 - 17:08) Winston написал(а):
А если
echo '<pre>';
print_r($matches);
echo '</pre>';

Тоже пусто ?

И покажите точно, то, что вам нужно распарсить и выдает сайт ?

Спустя 41 минута, 48 секунд (13.07.2011 - 17:50) John Cena написал(а):
да.

вот мое:

$str=file_get_contents("http://www.akkord-tour.com.ua/choose-me.php");
preg_match_all("#(\"|')table\\1>(.*)</table>.*#iuU", $str, $matches);
//preg_match_all("/^(.*)[class\=\"table\"](.*)[<\/table>](.*)/", $str, $matches); <-- ето я свои эксперименты проводил

echo '<pre>';
var_dump($matches);
echo '</pre>';


вседа выводит либо null либо пустые массивы

Спустя 12 минут, 26 секунд (13.07.2011 - 18:02) Winston написал(а):
А так попробуйте
$str=file_get_contents("http://www.akkord-tour.com.ua/choose-me.php");
preg_match_all("#>(.*)</table#iuU", $str, $matches);

echo '<pre>';
print_r($matches);
echo '</pre>';


PS: отредактируйте свой пост, и обрамите код тегами [php][/php]

Спустя 39 минут, 9 секунд (13.07.2011 - 18:41) John Cena написал(а):
это не совсем то...
оно выводит содержимое какой-то таблицы, но не той что нужно. мне нужно взять все, что внутри таблицы с классом table. Она там самая большая... та которая "Тип тура: Автобусный/Экскурсионный"

Спустя 10 минут, 35 секунд (13.07.2011 - 18:52) Winston написал(а):
Ну если нужно выбрать только то, что между таблицами с классом table то так
preg_match_all("#class=(\"|')table\\1.*>(.*)</table>#isu", $str, $matches);

Но внутри этой таблицы, есть еще таблицы.

Спустя 10 минут, 42 секунды (13.07.2011 - 19:02) John Cena написал(а):
да, спасибо большое щас получилось как нада!

Спустя 17 часов, 13 минут, 53 секунды (14.07.2011 - 12:16) John Cena написал(а):
скажите пожалуста а как сделать указать "не 'какое-то слово'"

если не понятно сказано, то вот пример:

<tr>
<td><a
href="/noindex"><img ... /></a></td><!-- то что нужно удалить -->
<td>
<table>
<tr><td><a
href="/index">Hello</a></td></tr>
</table>
</td>
<td></td>
</tr>


вот то что я написал, но оно не работает:

$str=preg_replace("/(<td>[^(<a)]*<a[^>]*><img[^>]*>[^(<\/td)]*<\/td>)/is","",$str);


так как я не ас, попробую описать, что я хотел этим сказать:

<td> - ищу все "<td>",
[^(<a)]*<a[^>]* - где нет "<a", до тех пор пока не встречу "<a",
[^>]*><img[^>]*> - где в "<а" есть "<img",
[^(<\/td)]*<\/td> - и после "img" может быть все кроме "<\/td", пока не встретится <\/td

и если такое будет то заменить его на "".

такое условия я пытался объяснить этим рег. выр. и ничего не получилось. сколько не искал в нете нигде не описано как сделать отрицание слова, т. е. вот это [^abc] значит, что не a,b или с, а как сказать не "abc"?

Спустя 2 минуты, 42 секунды (14.07.2011 - 12:19) Winston написал(а):
То есть вы хотите удалить все ссылки если они в виде изображения ?

Спустя 24 минуты, 56 секунд (14.07.2011 - 12:44) John Cena написал(а):
да, толко не только ссылки, а и <td>, в которых они находятся

Спустя 5 минут, 21 секунда (14.07.2011 - 12:49) Winston написал(а):
Попробуй так
$str = preg_replace("#<td>\s*<\s*a.*>\s*<\s*img.*>\s*</a>\s*</td>#isuU", '', $str);

Спустя 24 минуты, 49 секунд (14.07.2011 - 13:14) John Cena написал(а):
ну сейчас оно выводит "" и все. я как бы попробовал бы сам если бы кто то сказал как сделать отрицание слова, т. е. вот это [^abc] значит, что не a,b или с, а как сказать не "abc"?

Спустя 7 минут, 48 секунд (14.07.2011 - 13:22) Winston написал(а):
Цитата (John Cena @ 14.07.2011 - 13:14)
ну сейчас оно выводит ""

Хм.. Странно, но у меня все работает так как ты просил, то есть вырезается <td>...</td>
Вот пример

Свернутый текст
$str = '<tr>
<td><a href="/noindex"><img ... /></a></td><!-- то что нужно удалить -->
<td>
<table>
<tr><td><a href="/index">Hello</a></td></tr>
</table>
</td>
<td><a href="/noindex">блаблабла</a></td><!-- не удалять -->
<td></td>
</tr>'
;

echo htmlspecialchars($str);
echo '<br>';
$str = preg_replace("#<td>\s*<\s*a.*>\s*<\s*img.*>\s*</a>\s*</td>#iuU", '', $str);
echo '<br>';
echo htmlspecialchars($str);

Спустя 35 минут, 52 секунды (14.07.2011 - 13:58) John Cena написал(а):
я когда это писал пытался поменьше писать, если на то пошло то в ячейке с
<a href="/noindex"><img ... /></a> еще может быть и <br />, в остальных ячейках со ссылками тоже может <br />, но там в ссылках только текст и никаких картинок

Спустя 3 минуты, 23 секунды (14.07.2011 - 14:01) Winston написал(а):
John Cena
Из ваше объяснения практически ничего не понятно. По проще объясните и покажите полную часть кода, а не
Цитата (John Cena @ 14.07.2011 - 13:58)
поменьше писать


Спустя 50 минут, 25 секунд (14.07.2011 - 14:52) John Cena написал(а):

$str=file_get_contents("http://www.akkord-tour.com.ua/choose-me.php");//echo $str;
preg_match_all("#<table\s*class=(\"|')table\\1.*>(.*)</table>\\2#isu", $str, $matches);
$str=preg_replace("/(<td[^>]*>)/i","<td>",$matches[0][0]);
$str=preg_replace("/(<table[^>]*>)/i","<table>",$str);
$str = preg_replace("#<td>\s*<\s*a.*>\s*<\s*img.*>\s*</a>\s*</td>#isuU", '', $str);
echo ($str);


Свернутый текст

<tr>
<!-- вот отсюда --><td>
<br>
<a
href="http://www.akkord-tour.com.ua/store.php/category_id/106/land_id/2"><img title="Венгрия" alt="Венгрия" src="http://www.akkord-tour.com.ua/images/flags/hu.gif"></a><br><br><a href="http://www.akkord-tour.com.ua/store.php/category_id/106/land_id/22"><img title="Хорватия" alt="Хорватия" src="http://www.akkord-tour.com.ua/images/flags/hr.gif"></a><br>
</td>
<!-- до сюда нужно удалить -->
<td>
<table>
<tr>
<td>
<a
href="http://www.akkord-tour.com.ua/product.php/product_id/3931" style="font-weight: bold; font-size: 12px; color: rgb(160, 16, 16);">Доступная роскошь – Хорватия!</a>
<br><br>
Залакарош – Ривьера Цриквеницы – Будапешт<br><br>
</td>
</tr>
<tr>
<td>
</td>
</tr>
<tr>
<td>
<span
style="font-size: 14px; color: rgb(255, 0, 0); font-weight: bold;">Дата тура:</span> <span style="font-size: 14px; color: rgb(0, 0, 0); font-weight: bold;">07.08.2011</span>
</td>
<td>
<img
src="http://www.akkord-tour.com.ua/images/arrow.gif"> </td>
<td>
<table>
<tr>
<td>
<span
style="font-size: 13px; color: rgb(255, 0, 0); font-weight: bold;">Начало акции:</span> <span style="font-size: 13px; color: rgb(0, 0, 0); font-weight: bold;">05:30 (14.07.2011)</span>
</td>
</tr>
<tr>
<td>
<span
style="font-size: 13px; color: rgb(255, 0, 0); font-weight: bold;">Окончание акции:</span> <span style="font-size: 13px; color: rgb(0, 0, 0); font-weight: bold;">22:00 (14.07.2011)</span>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
<td>
 
8 дней
</td>
<td>
<span
class="price-old">€350.00 </span> <br><br><span style="font-size: 14px; font-weight: bold; color: rgb(0, 0, 0);">€299.00 </span><br><br>
</td>
</tr>


Спустя 11 минут, 29 секунд (14.07.2011 - 15:03) Winston написал(а):
Цитата (John Cena @ 14.07.2011 - 14:52)
$str = preg_replace("#<td>\s*<\s*a.*>\s*<\s*img.*>\s*</a>\s*</td>#isuU", '', $str);

Заменить на это
$str = preg_replace("#<td>.*<a.*>.*<\s*img.*</a>.*</td>#isuU", '', $str);

Спустя 1 час, 26 секунд (14.07.2011 - 16:04) John Cena написал(а):
я конешно понимаю шо я уже через чур сильно сел на шею, но теперь такой вопрос - таких участков html, который я написал выше может быть много, т.е

<table>
<tr>
html, который я написал выше</tr>
<tr>
html, который я написал выше</tr>
<tr>
html, который я написал выше</tr>
<tr>
html, который я написал выше</tr>
<tr>
html, который я написал выше</tr>
<tr>
html, который я написал выше</tr>
</table>


и сейчас у меня в таблице получается 10 строк, после
preg_replace("#<td>.*<a.*>.*<\s*img.*</a>.*</td>#isuU", '', $str);

выводится только последняя <tr>, но уже очищенная как надо

Спустя 10 минут, 46 секунд (14.07.2011 - 16:14) Winston написал(а):
Цитата (John Cena @ 14.07.2011 - 16:04)
выводится только последняя <tr>, но уже очищенная как надо

Я не совсем понял ?
Так, что не так ?

Спустя 59 минут, 28 секунд (14.07.2011 - 17:14) John Cena написал(а):
ну вот смотрите есть таблица:

$str='<table>
<tr №1><td>то что нужно убрать</td><td>что-то полезное</td></tr>
<tr №2><td>то что нужно убрать</td><td>что-то полезное</td></tr>
<tr №3><td>то что нужно убрать</td><td>что-то полезное</td></tr>
<tr №4><td>то что нужно убрать</td><td>что-то полезное</td></tr>
<tr №5><td>то что нужно убрать</td><td>что-то полезное</td></tr>
<tr №6><td>то что нужно убрать</td><td>что-то полезное</td></tr>
</table>'
;


фильтрую ее:

preg_replace("#<td>.*<a.*>.*<\s*img.*</a>.*</td>#isuU", '', $str);


после получается:

<table>
<tr
6><td>что-то полезное</td></tr>
</table>


а мне нужно что бы после preg_replace было так:

<table>
<tr
1><td>что-то полезное</td></tr>
<tr
2><td>что-то полезное</td></tr>
<tr
3><td>что-то полезное</td></tr>
<tr
4><td>что-то полезное</td></tr>
<tr
5><td>что-то полезное</td></tr>
<tr
6><td>что-то полезное</td></tr>
</table>

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.