我是Perl的新手,我试图在字符串中的所有<li> </li>
标记之间提取文本,并使用正则表达式或分割/连接将它们分配到数组中。
e.g。
my $string = "<ul>
<li>hello</li>
<li>there</li>
<li>everyone</li>
</ul>";
这个代码......
foreach $value(@array){
print "$value\n";
}
...导致此输出:
hello
there
everyone
答案 0 :(得分:6)
注意:不要使用正则表达式来解析HTML。
第一个选项是使用HTML::TreeBuilder完成的,{{3}}是可供使用的众多HTML解析器之一。您可以访问上面提供的链接并阅读文档并查看给出的示例。
use strict;
use warnings;
use HTML::TreeBuilder;
my $str
= "<ul>"
. "<li>hello</li>"
. "<li>there</li>"
. "<li>everyone</li>"
. "</ul>"
;
# Now create a new tree to parse the HTML from String $str
my $tr = HTML::TreeBuilder->new_from_content($str);
# And now find all <li> tags and create an array with the values.
my @lists =
map { $_->content_list }
$tr->find_by_tag_name('li');
# And loop through the array returning our values.
foreach my $val (@lists) {
print $val, "\n";
}
如果你决定在这里使用正则表达式(我不推荐)。你可以做点什么..
my $str
= "<ul>"
. "<li>hello</li>"
. "<li>there</li>"
. "<li>everyone</li>"
. "</ul>"
;
my @matches;
while ($str =~/(?<=<li>)(.*?)(?=<\/li>)/g) {
push @matches, $1;
}
foreach my $m (@matches) {
print $m, "\n";
}
输出:
hello
there
everyone
答案 1 :(得分:1)
注意: Do not use regular expressions to parse HTML。
hwnd已经提供了一个HTML Parser解决方案。
但是,对于基于css选择器的更现代的HTML Parser,您可以查看Mojo::DOM
。在Mojocast episode 5
有一个非常翔实的8分钟介绍视频。
use strict;
use warnings;
use Mojo::DOM;
my $html = do {local $/; <DATA>};
my $dom = Mojo::DOM->new($html);
for my $li ($dom->find('li')->text->each) {
print "$li\n";
}
__DATA__
<ul>
<li>hello</li>
<li>there</li>
<li>everyone</li>
</ul>
输出:
hello
there
everyone