LINUX.ORG.RU

Снова regex для таблицы


0

0

Как можно получить _все_ ячейки строки таблицы (содержимое всех <td></td> в строке)?

Я делаю вот так:

/<tr[^>]*>(<td[^>]*>(.*?)<\/td>)+<\/tr>/s 

Но получаю ячейки из тех строк, где только один элемент <td></td>, т.е. только строки такого вида:

<tr>
  <td>qewr qewr qwer</td>
</tr>

Где косяк?
Ответ на: комментарий от Sphinx

> Задача обязательно подразумевает использование регулярных выражений?

Да, задача такова:

"Скриптом войти в ящик на mail.ru и вытащить заголовки 
всех писем с помощью регулярных выражений."

В принципе, задачу уже решил (просто выбором нужных <td> </td>), 
но хотелось бы еще помечать "прочитанные/непрочитанные", а инфа об 
этом содержится только в <tr> в виде class="noread", т.е. так:

<tr class="noread">
  ...
  <td class="lettem">тема письма</td>
  <td class="letavt">автор письма</td>
  ...
</tr>

Ну и таких строк много.

it-partizan
() автор топика
Ответ на: комментарий от Sphinx

> Задача обязательно подразумевает использование регулярных выражений?

А какой вариант вы хотели предложить?

Использовать HTML-парсер?

it-partizan
() автор топика
Ответ на: комментарий от r_asian

Да, я ее и использую. Вот так:

$pattern = '/<tr[^>]*>(<td[^>]*>(.*?)<\/td>)*<\/tr>/s';
preg_match_all($pattern, $file_contents, $matches);

Проблема в самом выражении. 
Я получаю только строки, в которых есть одна ячейка - <tr><td></td></tr>.

А нужно получить все ячейки (все <td></td>).

it-partizan
() автор топика
Ответ на: комментарий от it-partizan

Ну так правильно, ты так регексп написал, что пробелов между </td> и </tr> быть не может.

rab_boziy
()
Ответ на: комментарий от it-partizan

'/<td.*?>(.*?)<.*?\/td.*?>/i';

Вот так будет правильно. Выражение немного избыточно, но в html-коде чего только не пишут, так что не помешает.

r_asian ★☆☆
()

Some people, when confronted with a problem, think, "I known, I'll use 
regular expressions." Now they have two problems.
        -- Jamie Zawinski in comp.lang.emacs

;-)

php-coder ★★★★★
()
Ответ на: комментарий от it-partizan

Поставь что-ли /ism чтобы все как одну строчку пройти.
Вроде так php делается...

zJes ★★
()

> Где косяк?

в ДНК у составителя задания :) какбэ DOM придумали наверно для этих целей.

phasma ★☆
()
Ответ на: комментарий от php-coder

> Some people, when confronted with a problem, think, "I known, I'll use > regular expressions." Now they have two problems. > -- Jamie Zawinski in comp.lang.emacs

Класс!)

Но не про меня, к сожалению. У меня задача в изучении этих самых регулярных выражений и выполнении тестового задания

it-partizan
() автор топика
Ответ на: комментарий от phasma

> в ДНК у составителя задания :) какбэ DOM придумали наверно для этих целей.

Да, ты прав. Сделал второй вариант с HTML-парсером, получилось приятнее и логичнее.

it-partizan
() автор топика
Ответ на: комментарий от r_asian

> '/<td.*?>(.*?)<.*?\/td.*?>/i';

> Вот так будет правильно. Выражение немного избыточно, но в html-коде чего только не пишут, так что не помешает.

Но оно не не выбирает еще и <tr>, а в TR указано class="noread", по которому я определяю, прочитано письмо или нет

it-partizan
() автор топика
Ответ на: комментарий от it-partizan

> Но оно не не выбирает еще и <tr>, а в TR указано class="noread", по которому я определяю, прочитано письмо или нет

вообще для этого есть POP3/IMAP ... ты в mail.ru чель хочешь пойти работать ?

phasma ★☆
()
Ответ на: комментарий от phasma

> вообще для этого есть POP3/IMAP ... ты в mail.ru чель хочешь пойти работать ?

=))

Искренне благодарю за открытие америки на отдельно взятом форуме!

Нет, не в мейл.ру, но работу сменить собираюсь.

А решение подсказать может кто?

P.S. 2phasma - без обид!

it-partizan
() автор топика

мне кажется, правильнее всего (в данном контексте) сделать вот так:

my $r="... вся страница ...";

while ($r=~s/<tr>(.*?)<\/tr>//s) {
my $line=$1;
$line=~/(?:<td[^>]*>(.*?)<\/td>)+/;
my ($sender,$header,...)=($1,$2,$3,$4,...);
}

vahvarh ★★★
()

it-partizan, тебе уже сказали DOM в помощь. Оно как раз для таких целей. С экономишь себе кучу времени.

//stoting

anonymous
()
Ответ на: комментарий от anonymous

> it-partizan, тебе уже сказали DOM в помощь. Оно как раз для таких целей. С экономишь себе кучу времени.

Про ДОМ в курсе, сделал уже вариант и через ДОМ, гораздо приятнее.

Но задание надо выполнить используя _именно_ регулярные выражения. Так что никуда от них не деться.

Сейчас буду пробовать предложенные варианты, т.к. сегодня надо отправить результаты.

it-partizan
() автор топика

Итог:

Сделать одним выражением не получилось, сделал поэтапно - сначала выдираю нужную таблицу, потом получаю ее строки и в каждой из них ищу интересующие меня строки.

Всем участникам спасибо!

it-partizan
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.