Perl正则表达式将alt属性与强制匹配,但有时alt属性在src属性之前,有时在src属性之后

时间:2013-07-21 06:01:31

标签: regex perl html-parsing

我正面临Perl正则表达式的问题。在img元素上,我想匹配rel,class,alt src属性。但是如果alt属性存在则alt属性应该是强制匹配,然后应该获取其文本。但是我面临着alt属性存在的问题,在src属性之后存在Firefox和chrome alt属性,而在IE浏览器上它存在于src属性之前。

因为我希望alt属性作为强制匹配,但有时它在src属性之前,有时在src属性之后。下面是img元素源代码。请帮忙!

在Chrome和Firefox上:

<img rel="lightbox[45876]" src="/file?id=13455" class="bbc_img" alt="effectgames777.jpg">
<img rel="lightbox[45876]" src="/file?id=13455" class="bbc_img">

在IE浏览器上:

<img rel="lightbox[45876]" class="bbc_img" alt="effectgames777.jpg" src="/file?id=13455">
<img rel="lightbox[45876]" class="bbc_img" src="/file?id=13477">

我在perl regex下面创建了但是它不匹配alt属性作为强制。请帮忙!

<img(?:|\s+rel="[^"]*")(?:|\s+class="[^"]*")(|\s+alt="([^"]*)") src\=\"(http\:\/\/domain\.com\/(\d+)\/thumb\/(\d+)|\/file\?id\=(\d+))\"(?:|\s+class="[^"]*")(|\s+alt="([^"]*)")\>

1 个答案:

答案 0 :(得分:2)

它必须只是一个正则表达式吗?

use Data::Dumper;

my $s = q{<img  rel="relfoo"  src="srcfoo">};

my @m;
$s =~ m{
  <img \s+ 
    ( 
      ((\w+)(?{push @m, $^N})) 
      = 
      "( ([^"]*) (?{push @m, $^N}) )" 
      \s* 
    )+
  >
}x;
my %h = @m;
print Dumper \%h;
die "alt is mandatory..\n" if !exists $h{alt};

输出

$VAR1 = {
          'rel' => 'relfoo',
          'src' => 'srcfoo'
        };
alt is mandatory..