2

Perl 正規表現の問題に直面しています。要素で、属性を , で始まる値と、 anyおよび属性imgに一致させたいと考えています。以下のように、存在する場合と存在しない場合がある属性を無視したい:src/file?idclassaltrel

<img rel="lightbox[45451]" src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">    

<img  src="/file?id=13166" class="bbc_img" alt="myimagess.jpg">

私の質問は、オプションのrel属性を処理する方法です。

私はrel属性の一致のためにこれを試みています:

(?!\s+(rel)="([^"]+)")

属性がない場合は機能しますが、属性がある場合はrel失敗します。imgrel

4

3 に答える 3

1

HTML::TreeBuilder::XPathを使用してこれを行う適切な方法。relこれは、他の属性を無視し、タグ内の属性の順序に依存しません。

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder::XPath;
use Test::More tests => 1;

my $root= HTML::TreeBuilder::XPath->new_from_content( do { local undef $/; <DATA> });

# this is the important part 
my @imgs= $root->findnodes( '//img[starts-with( @src,"/file?id=") and @class and @alt]');

# checks the results
my $hits= join ' ', map { "H:" . src_id( $_->{src}) } @imgs;
is( $hits, 'H:13166 H:13167', "one test");

# shows how to access the attributes
foreach my $img (@imgs)
  { warn "hit: src= $img->{src} - class=$img->{class} - alt: $img->{alt} - id= ", src_id( $img->{src}), "\n"; }

exit; 

sub src_id
  { my( $src)= @_;
    return $src=~  m{/file\?id=(.+)$} ? $1 : 'no id'; 
  }

__DATA__
<html>
  <head><title>Test HTML</title></head.
  <body>
    <img rel="lightbox[45451]" src="/file?id=13166" class="bbc_img" alt="myimagess1.jpg">
    <img class="bbc_img" src="/file?id=13167" alt="myimagess2.jpg">
    <img src="/file?id=13168" class="bbc_img" >
    <img src="/file?id=13169" alt="myimagess3.jpg">
    <img  src="/foo" class="bbc_img" alt="myimagess.jpg4">
  </body>
</html>
于 2013-07-19T08:15:43.863 に答える