匹配不在标记<div> </div>中的所有内容

时间:2011-06-25 11:22:03

标签: regex perl

我需要正则表达式匹配所有而不是<div>标记。例如:

foobar<p>lol</p><div>something</div>blahblah

应匹配foobar<p>lol</p>blahblah

3 个答案:

答案 0 :(得分:3)

正如Mat和maenu已经指出的那样,使用正则表达式解析HTML就是说 - 最不容易出错。由于您使用perl标记标记了您的问题,我将使用HTML::TokeParser::Simple给您一个小例子,我认为这是对这些操作的一个很好的选择。

use strict;
use warnings;

use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new( *DATA );

my $is_in_div;
while ( my $token = $parser->get_token ) {
    if ( $token->is_start_tag( 'div' ) ) {
        $is_in_div++;
        next;
    }
    if ( $token->is_end_tag( 'div' ) ) {
        $is_in_div--;
        next;
    }
    print $token->as_is if not $is_in_div;
}   

__DATA__
foobar<p>lol</p><div>something</div>blahblah
foobar<p>lol</p><div>more stuff<div>something</div></div>blahblah

答案 1 :(得分:0)

不确定您要完成什么,并且警告这不适用于所有HTML(请参阅here),但以下内容可能会解决问题:

#!/opt/perl/bin/perl

use strict;
use warnings;
use 5.010;

my $html = 'foobar<p>lol</p><div>something</div>blahblah';

my @fragments = split(m{<div\b[^>]*>.*?</div>}is, $html);
say foreach @fragments;

有关详细信息,请参阅perldoc -f splitperldoc perlre

答案 2 :(得分:-1)

Select *:not(div)