我正试图通过“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函数,每个表应该单独解析?
谢谢!
答案 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")