【问题标题】:Perl regex to match alt attribute as mandatory but sometimes alt attribute comes before src attribute and sometimes after src attributePerl 正则表达式将 alt 属性匹配为强制,但有时 alt 属性在 src 属性之前,有时在 src 属性之后
【发布时间】:2013-07-20 03:00:20
【问题描述】:

我遇到了 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="([^"]*)")\>

【问题讨论】:

  • 恭喜,您已经开始了解为什么用正则表达式解析 HTML 毫无意义。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的 Perl 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/perl
  • 谢谢!但我需要使用正则表达式来解决这个问题。
  • 这是为什么呢?为什么必须使用正则表达式?
  • 其他人已经指出您不应该使用正则表达式解析 HTML。但是正则表达式还有另一个秘密:通常不需要用一个正则表达式来解决多个问题。 Perl 很棒。它甚至允许您在一个脚本中拥有多个正则表达式。

标签: regex perl html-parsing


【解决方案1】:

是否必须只有一个正则表达式?

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..

【讨论】:

  • 没错。人们不仅想用正则表达式解决每一个问题,他们还想用 single 正则表达式来解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2014-12-03
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多