Perl - 用“table”标签及其内容拆分html代码

时间:2011-08-02 15:27:30

标签: html regex perl split

我正试图通过“table”标签及其内容拆分html代码。

所以,我试过

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')。 任何人都可以告诉我如何指定split函数,每个表应该单独解析?

谢谢!

4 个答案:

答案 0 :(得分:4)

你的正则表达式是贪婪的,把它改成/<table.*?\/table>/它会做你想要的。但是如果你要做任何认真的工作,你应该真正研究一个合适的HTML解析器。搜索CPAN应找到适合您需求的那个。

答案 1 :(得分:3)

你的正则表达式.*是贪婪的,因此咀嚼到字符串的最后部分。将其更改为.*?,它应该会更好。

答案 2 :(得分:2)

使用?指定非贪婪的外卡诽谤,即

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

答案 3 :(得分:2)

使用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")