Perl regex将alt属性作为必需项进行匹配,但有时alt属性位于src属性之前,有时位于src属性之后

Perl regex将alt属性作为必需项进行匹配,但有时alt属性位于src属性之前,有时位于src属性之后,regex,perl,html-parsing,Regex,Perl,Html Parsing,我面临Perl正则表达式的问题。在img元素上,我希望匹配rel、class、alt src属性。但alt属性应该是强制匹配的。如果alt属性存在,则应该提取其文本。但我面临着alt属性存在的问题,在Firefox和chrome上,alt属性存在于src属性之后,在IE浏览器上,alt属性存在于src属性之前 因为我希望alt属性作为强制匹配,但有时它在src属性之前,有时在src属性之后。下面是img元素的来源。请帮忙 在Chrome和Firefox上: <img rel="lightb

我面临Perl正则表达式的问题。在img元素上,我希望匹配rel、class、alt src属性。但alt属性应该是强制匹配的。如果alt属性存在,则应该提取其文本。但我面临着alt属性存在的问题,在Firefox和chrome上,alt属性存在于src属性之后,在IE浏览器上,alt属性存在于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="([^"]*)")\>

是否只需要一个正则表达式

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};

恭喜你,你已经开始明白为什么用正则表达式解析HTML毫无意义了。不要用正则表达式来解析HTML。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已编写、测试和调试的Perl模块正确解析HTML的示例,请参阅。谢谢!但是我需要用正则表达式来解决这个问题。为什么?为什么它必须使用正则表达式?其他人已经指出,不应该用正则表达式解析HTML。但是正则表达式还有一个秘密:通常不需要用一个正则表达式解决多个问题。Perl很棒。它甚至允许您在一个脚本中使用多个正则表达式。人们不仅希望用正则表达式解决所有问题,而且往往希望用单个正则表达式来解决。
$VAR1 = {
          'rel' => 'relfoo',
          'src' => 'srcfoo'
        };
alt is mandatory..