我正在寻找一个Perl Regex来从以下代码中提取所有图像:
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
要注意的事项是:
到目前为止我尝试了什么:
while ($html =~ /["|'|=](.*\.jpg|gif|png|bmp|swf).*"/g) {
my $item = $1;
$item =~ s/\"|\'|=//g;
push (@images, $item);
}
但这并没有真正奏效。
感谢您的帮助。
答案 0 :(得分:2)
一个简单的正则表达式可能是:
["'][^'"]*[.](jpg|png)["']
虽然在包括'
或"
在内的slideshowimages("images/image'1'.jpg")
路径上会失败。可以处理这种情况的表达式是:
('.*?\.(jpg|png)')|(".*?\.(jpg|png)")
答案 1 :(得分:2)
my @images = $html =~ /["'] (.+?) ["']/gx; # /g for multiple hits on a line
答案 2 :(得分:1)
/(["']).*?\.(jpg|gif|png|bmp|swf)\1/
您需要捕捉您正在使用的内容,单引号或双引号,并参考该内容 此外,您需要对扩展程序的选择进行分组。否则,你说'任何以jpg结尾的东西或只是简单的gif(,png等)'。
调整@ mpapec的答案:
my @images = $html =~ /(["'])[^"']*?\.(jpg|gif|png|bmp|swf)\1/g;
(不允许“和”在文件名中也可能是一个好主意。)
答案 3 :(得分: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 - 捕获单引号或双引号