[регекспы] Распарсить html?

dalet

есть открывающий тег (<table) и закрывающий тег (/table). Нужно получить структуру самой внешней таблицы (может не одной)
т.е. что-то типв такого "<table<tr<td</td</tr</table"
я уже некоторой последовательностью регэкспов научился оставлять только теги таблиц, получилось
<table<tr<td</td<td<table<tr<td</td</tr</table</td</tr</table"
теперь вопрос , как удалить все внутренние таблицы?
т.е. нужно регулярное выражение дающие таблицы первой вложенности.

sergey_m

3 раза перечитал, не понял что хочется. Удалить все тэги <table></table> кроме самых внешних? Удалить их вместе с содержимым?

dalet

хочеться получить структуру только внешней таблицы

sergey_m

То есть удалить вложенные <table>xxx</table> целиком?

dalet

точно

sergey_m

что-то типа этого должно работать


s/<table>(.*)<\/table>/XXX$1XXY/ # метим внешние тэги
s/<table>.*?<\/table>// #вырезаем внутренние в "нежадном" режиме
s/XXX/<table> # возвращаем назад внешние
s/XXY/<\/table/

eduard615

<table><table><table></table></table></table>
?

sergey_m

угу. нужно еще подумать

dalet

да , я еще забыл добавить , что внешних таблиц может быть несколько
<table><table></table></table><table><table></table></table>

sergey_m

это ерунда, просто ключ 'g' в конце регекспа. Вот про вложенные подумать надо.

dalet

что значит ключ g
у меня вто это
<table<table</table</table<table<table</table</table
преобразуется в
XXXXXX<table</table</table<table<table</tableXXYYYYY
вместо
XXXXXX<table</tableXXYYYYYXXXXXX<table</tableXXYYYYY

sergey_m


g нужно не в первом regexp, а в втором, который удаляет вложенные

dalet

все равно идея непрокатит даже без таблиц 2 вложенности
<table<table</table</table<table<table</table</table
дает
<table</table</table

evgen5555

А поконкретнее задачу поставить можно?
Чтобы с примером?
P.S. Всё, воткнул

sergey_m

Так тут две таблицы независимых одна за другой. Такого в постановке задачи не было.
P.S. плс закрывай тэги, а то читать тяжело

evgen5555

А в цикле можно s/ выполнять?

dalet

как это в цикле ты хочешь сделать?

evgen5555


s/<\/table/X/
s/<table/Y/
s/YYXX/YX/ - это надо зацклить
s/X/</table/
s/Y/<table/

Svyatogor

Если зациклить, то для sed будет так:


s/<table>/B/g
s/<\/table>/E/g
: l1
s/\(B[^E]*\)B[^E]*E/\1/
t l1
s/B/<table>/g
s/E/<\/table>/g
q


Или можно использовать только команду замены?

dus1970



cd /usr/ports/www/p5-HTML-Parser
make install


иногда велосипед уже изобрели
Оставить комментарий
Имя или ник:
Комментарий: