在perl中使用Regex在两个值之间提取信息

时间:2014-10-01 13:40:14

标签: regex perl

我目前遇到以下问题;

      open(my $fh, "<", "index.html") or die "cannot open index.html";

      foreach my $line  (<$fh>) {
              $line =~ '\"(.*?)\';
              print $line;

我的正则表达式无法正常工作,我将在下面向您展示我想要获得的内容;

<hr/>NUMBER.<br/><img class="cqm" border="0" src="UNIQUENUMBER..png"/>
<hr/>NUMBER.<br/><img class="cqm" border="0" src="UNIQUENUMBER..png"/>

现在我已经用DPA替换了实际数字,但这些都是唯一的,.html文件采用上述格式,上面有100个条目。

我需要用每一行去除它,并且它只在src =&#34;之间打印UNIQUENUMBER。和..png

非常感谢任何帮助。

谢谢你, 阿什利

3 个答案:

答案 0 :(得分:1)

我不知道为什么你认为正则表达式会起作用。它只匹配双引号和单引号之间的第一个字符串大小写(无论如何都应该存在)。你在寻找的是:

$line =~ /src="(.*?)\.*png"/;
print $1;

答案 1 :(得分:0)

use strict;
use warnings;

open my $in, '<', 'in.txt';

while(<$in>){
    chomp;
    my ($nums) = /src="(\d+?\.?\d+?)\.\.png/;
    print "$nums\n";
}

将匹配0.111.0

答案 2 :(得分:0)

我强烈建议您在处理HTML时使用实际的HTML Parser。

以下使用Mojo::DOM使用类.cqm提取所有图像标记,并在png结束时输出src属性:

use strict;
use warnings;
use autodie;

use Mojo::DOM;

#open my $fh, "<", "index.html";
my $fh = \*DATA;

my $dom = Mojo::DOM->new(
    do { local $/; <$fh> }
);

for my $src ( $dom->find('img.cqm')->attr('src')->each ) {
    if ( $src =~ /(.*)\.png/ ) {
        print "$1\n";
    }
}

__DATA__
<hr/>NUMBER.<br/><img class="cqm" border="0" src="UNIQUENUMBER..png"/>
<hr/>NUMBER.<br/><img class="cqm" border="0" src="UNIQUENUMBER..png"/>

输出:

UNIQUENUMBER.
UNIQUENUMBER.

要获得有用的8分钟介绍性视频,请查看Mojocast Episode 5