perl使用正则表达式在html标签之间提取文本

use*_*023 0 html regex tags perl

我是Perl的新手,我试图<li> </li>在字符串中的所有标签之间提取文本,并使用正则表达式或分割/连接将它们分配到数组中.

例如

my $string = "<ul>
                  <li>hello</li>
                  <li>there</li>
                  <li>everyone</li>
              </ul>";
Run Code Online (Sandbox Code Playgroud)

这个代码......

foreach $value(@array){
    print "$value\n";
}
Run Code Online (Sandbox Code Playgroud)

...导致此输出:

hello
there
everyone
Run Code Online (Sandbox Code Playgroud)

hwn*_*wnd 6

注意:不要使用正则表达式来解析HTML.

第一个选项是使用HTML :: TreeBuilder完成的,HTML :: TreeBuilder是可以使用的许多HTML Parser之一.您可以访问上面提供的链接并阅读文档并查看给出的示例.

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";
}
Run Code Online (Sandbox Code Playgroud)

如果你决定在这里使用正则表达式(我不推荐).你可以做点什么......

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";
}
Run Code Online (Sandbox Code Playgroud)

输出:

hello
there
everyone
Run Code Online (Sandbox Code Playgroud)