0

我正面临 Perl 正则表达式的问题。在 img 元素上,我想匹配 rel、class、alt src 属性。但是如果 alt 属性存在,则 alt 属性应该是强制匹配的,那么应该获取它的文本。但是我面临 alt 属性存在的问题,在 Firefox 和 chrome 上,alt 属性存在于 src 属性之后,而在 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 正则表达式下创建了,但它不匹配 alt 属性作为强制性的。请帮忙!

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

1 回答 1

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..
于 2013-07-21T08:01:39.297 回答