1

我正在寻找一个 Perl 正则表达式来从以下代码中提取所有图像:

slideshowimages("images/image1.jpg","images/image2.png","images/image3.jpg")
slideshowimages('images/image4.jpg','images/image5.png','images/image6.jpg')

输出将是一个数组,其中包含:

images/image1.jpg, images/image2.png, images/image3.jpg, images/image4.jpg, 
images/image5.png, images/image6.jpg

需要注意的事项是:

  • 图片扩展名可以是 .jpg / .png
  • 图像可以在单引号或双引号内

到目前为止我已经尝试过:

while ($html =~ /["|'|=](.*\.jpg|gif|png|bmp|swf).*"/g) {
    my $item = $1;
    $item =~ s/\"|\'|=//g;
    push (@images, $item);
}

但这并不能很好地工作。

感谢您的帮助。

4

4 回答 4

2

一个简单的正则表达式可以是:

["'][^'"]*[.](jpg|png)["']

正则表达式可视化

'它会在包括或"类似的路径上失败slideshowimages("images/image'1'.jpg")。可以处理这种情况的表达式是:

('.*?\.(jpg|png)')|(".*?\.(jpg|png)")

正则表达式可视化

于 2013-11-07T14:38:13.523 回答
2
my @images = $html =~ /["'] (.+?) ["']/gx; # /g for multiple hits on a line
于 2013-11-07T14:38:34.157 回答
1
/(["']).*?\.(jpg|gif|png|bmp|swf)\1/

您需要捕获您正在使用的内容,单引号或双引号,然后再参考。
此外,您需要对扩展名的选择进行分组。否则,您会说“以 jpg 结尾的任何内容或只是普通的 gif(、png 等)”。


调整@mpacec 的回答:

my @images = $html =~ /(["'])[^"']*?\.(jpg|gif|png|bmp|swf)\1/g;

(在文件名中禁止 " 和 ' 也可能是个好主意)。

于 2013-11-07T14:40:57.227 回答
1
my $html = <<EOF;
slideshowimages("images/image'1'.jpg","images/image2.png","images/image3.jpg")
slideshowimages('images/image4.jpg','images/image5.png','images/image6jpg')
EOF

my @images = ();
while ($html =~ s/(["'])(.+?\/.+?\.(?:jpg|png|gif))\1//) {
    push @images, $2;
}
foreach my $image (@images) {
        print "$image, ";
}

这有点限制,所以它不会得到“images/image6png”

不会在“images/image'1'.jpg”上失败

(["']) - 单引号或双引号(括号之间的任何字符)并捕获

( - 开始捕获

.+?/ - 一个或多个字符,直到第一个斜杠

.+?。- 一个或多个字符直到第一个句点

(?: - 开始分组而不捕获

jpg|png|gif - 任何字符串

) - 结束分组而不捕获

) - 结束捕获

\1 - 捕获的单引号或双引号

于 2013-11-07T15:14:34.820 回答