Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Помогите с регулярным выражением


Автор: JFox 7.5.2010, 18:39
Здравствуйте, помогите пожалуйста составить регулярное выражение, которое будет вытаскивать из кода все данные, находящиеся между тегами <tr>(.*)</tr>
Пробовал так:
Код

<?
$html = file_get_contents('http://www.ganjawars.ru/stats-objects.php?x=52&y=53');
preg_match_all( "#<tr>(.*?)<\/tr>#iU", $html, $result );
print_r($result);
?>


но почему то не работает(

вот вырезка из странички, которую парсинм:
Код

<table class=wb align=center cellspacing=0 cellpadding=3>
<tr>
<td class=wb align=center><b>1</b></td>
<td class=wb><a href=/syndicate.php?id=4843>#4843</a> Третий синдикат.</td>
<td class=wb align=center>1,903.52</td>
<td class=wb align=center>$17,594</td>
</tr><tr>


нужно поулчить:
 
Array[0] ( 
[0] =>4843
[1] =>Третий синдикат 
[2] =>1,903.52
[3] =>17,594
)
Array[1] ( 
[0] =>.....
[1] =>..... 
[2] =>.....
[3] =>.....
)
и так далее.

И на этой же странице вторая табличка, полагаю принцип один, но мало ли
Код

<tr>
<td class=wb align=center><b>1</b></td>
<td class=wb><a href=/syndicate.php?id=4843><img src=http://images.ganjawars.ru/img/synds/4843.gif width=20 height=14 border=0></a><a href=/object.php?id=78041>Плантация</a> [31], <a href=/info.php?id=255324><b>CHUVAAK</b></a></td>
<td class=wb align=center>1,650.69</td>
<td class=wb align=center>$495,207</td>
</tr


Array[1] ( 
[0] =>4843.gif
[1] =>Плантация 
[2] =>255324
[3] =>CHUVAAK
[1] =>Плантация 
[2] =>1,650.69
[3] =>495,207
) и так все данные , пока не кончится таблица

Автор: WebAngel 7.5.2010, 19:24
Кто сказал, что тебе нада tr? тебе нужно тоже самое но для td.

А чтобы получить:

Array[0] ( 
[0] =>4843
[1] =>Третий синдикат 
[2] =>1,903.52
[3] =>17,594
)

результат обработать напильником.

можешь еще погуглить на тему: DOMDocument, simplexml_import_dom и xpath

Автор: JFox 7.5.2010, 20:11
WebAngel, мне нужно вытащить этот блок
Код

<tr>
<td class=wb align=center><b>1</b></td>
<td class=wb><a href=/syndicate.php?id=4843>#4843</a> Третий синдикат.</td>
<td class=wb align=center>1,903.52</td>
<td class=wb align=center>$17,594</td>
</tr>

в отдельный массив Array[1], следующий аналогичный блок в Array[2] и  т.д. , если указывать td вместо tr, все данные идут одной большой кучей, я думал что в данном случае именно tr должен быть "стартом и финишем"..(

Мне потом надо будет все внести в бд, следовательно содержимое <tr>*</tr> будет одной записью(надеюсь понятно написал smile

И подскажите, если не сложно, как можно вытащить только тот блок, в котором есть определенная надпись (например id=4843)

Автор: brother79 11.5.2010, 05:53
Цитата(JFox @  7.5.2010,  22:39 Найти цитируемый пост)
preg_match_all( "#<tr>(.*?)<\/tr>#iU", $html, $result );


Но вообще-то всё правильно составленно и должно работать. Я только обычно ещё экранирую <>, т.е. они вроде тоже что-то означали, типа граници слова кажется, надо смотреть.

Автор: SelenIT 11.5.2010, 09:14
brother79, сами по себе <> ничего не означают. Но иногда меняют смысл скобок: (?>...) - однократная незахватывающая проверка, (?<=) - проверка предшествующего текста.

JFox, зачем в реге двойная инверсия жадности (в .*? + модификатор U)? И еще модификатор s нужен, т.к. по умолчанию точка не ловит перевод строки.
 
Цитата(WebAngel @  7.5.2010,  19:24 Найти цитируемый пост)
можешь еще погуглить на тему: DOMDocument, simplexml_import_dom и xpath

Поддерживаю. Для нетривиального парсинга неизвестного HTML это более адекватные средства, чем реги.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)