Perl - разделить HTML-код по тегу "table" и его содержимому - PullRequest
1 голос
/ 02 августа 2011

Я пытаюсь разделить кусок HTML-кода по тегу "table" и его содержимому.

Итак, я попробовал

my $html = 'aaa<table>test</table>bbb<table>test2</table>ccc';
my @values = split(/<table*.*\/table>/, $html);

После этого я хочу, чтобы массив @values ​​выглядел так: array('aaa', 'bbb', 'ccc'). Но он возвращает этот массив: array('aaa', 'ccc'). Может кто-нибудь сказать мне, как я могу указать для функции разделения, что каждая таблица должна анализироваться отдельно?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 02 августа 2011

Ваше регулярное выражение жадное, измените его на /<table.*?\/table>/, и оно будет делать то, что вы хотите. Но вы действительно должны изучить правильный HTML-парсер, если собираетесь делать какую-то серьезную работу. Поиск CPAN должен найти тот, который соответствует вашим потребностям.

3 голосов
/ 02 августа 2011

Ваше регулярное выражение .* является жадным, поэтому жует свой путь к последней части строки.Измените его на .*?, и оно должно работать лучше.

2 голосов
/ 02 августа 2011

Возможно, использование HTML-парсера немного излишне для вашего примера, но окупится позже, когда ваш пример будет расти. Решение с использованием HTML :: TreeBuilder :

use HTML::TreeBuilder;
use Data::Dump qw(dd);

my $html = 'aaa<table>test</table>bbb<table>test2</table>ccc';
my $tree = HTML::TreeBuilder->new_from_content($html);

# remove all <table>....</table>
$_->delete for $tree->find('table');

dd($tree->guts);        # ("aaa", "bbb", "ccc")
2 голосов
/ 02 августа 2011

Используйте ? для указания не жадного подстановочного знака, то есть

my @values = split(/<table*.*?\/table>/, $html);
...