[Perl] Регулярные выражения - повторяющиеся подстроки

kruzer25

Допустим, есть паттерн типа:
/<table><tr><td>(.*?)<\/td>)*?)<\/tr>)*?)<\/table>/

Он схватит все простые таблицы в тексте (где у table,tr,td нет никаких параметров, между ними нет никаких пробелов и т.д.)
А как теперь получить, например, содержимое первой строки (tr)? \${2} возвращает последнее соответствие - последнюю строку... есть ли что-нибудь типа \${2}{1} ?

artimon

Он схватит все простые таблицы
Не угадал. Он схаватит только первую таблицу в тексте.
Ботай флаг g.

rosali

Пиши еще раз... Ничего не понятно
 
[xenon ~]$ perl -ne '/<table><tr><td>(.*?)<\/td>)*?)<\/tr>)*?)<\/table>/ and print "$1,$2,$3,$4,$5\n"';
<table><tr><td>text</td></tr></table><table><tr><td>xxx</td></tr></table>
<tr><td>text</td></tr>,<tr><td>text</td></tr>,<td>text</td>,<td>text</td>,text

Чего не так то?

rosali

А что дает g в применении к m//? Тогда уж надо что-то типа

s/...../process($2);""/ge

kruzer25

Честно говоря, мне это надо не для команды perl, а для php-шной функции preg_replace...

rosali

А что есть разница, то есть у тебя другой результат получается? Там же вроде pcre, нет? На всякий случай я бы заменил (.*?) на ([^<]*) а то мало ли, вдруг в php не работает этот "модификатор нежадности"...

kruzer25

Я про
Не угадал. Он схаватит только первую таблицу в тексте.
Ботай флаг g.
В preg_replace по умолчанию ищутся (и заменяются) все вождения, подпадающие под шаблон.
Всё-таки, как можно узнать первую строку? Или первую ячейку?

kruzer25

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

kruzer25

Или, может, это ereg_replace делать умеет?
Где тогда можно достать максимально понятное руководство по регулярным выражениям ereg_replace?
О preg_replace - искал на perl.org - там всё достаточно понятно, но вот о таких вещах не нашёл ни слова...

rosali

Ой, только сейчас понял, о чем речь! у тебя в таблице может быть несколько строк!.. Вобщем не знаю ничего лучшего как вынимать каждую таблицу целиком, потом писать новый регексп, который вынимает строки по одной и по очереди их обрабатывать. При обработке строки придется написать третий регексп, который бы обрабатывал по одной ячейки. Того чего ты хочешь по-моему в регулярных выражениях нет...
PS. почему бы тебе не понавставлять в твой регексп \s* кругом, а то многие таблицы не поматчатся...

Barbie29

ботай регулярные выражения:
http://genphys.phys.msu.ru/~dmitriyk/perl/regex.shtml

kruzer25

Да, хреновое решение...
PS: тут я написал максимально упрощённый вариант... чтобы не возникало лишних вопросов...

kruzer25

Поботал, того, что надо, не нашёл... можно поконкретнее?

wwoland

Ботай теорию формальных языков!

kruzer25

А конкретнее?

wwoland

регулярные выражения!
вообще то это шутка!

kruzer25

up...
Пока что - какое-то решение есть (спасибо но хотелось бы всё-таки сделать это с использованием только одного preg_replace...

artimon

Не надо этого хотеть.
10 простых команд работают быстрее одного сложного регекспа.

kruzer25

Не такие уж они и простые получились...

Barbie29

ну а че ты хочешь, в твоем случае надо самому придумывать.
Оставить комментарий
Имя или ник:
Комментарий: