获取URL中的图像名称的第一个匹配(正则表达式,Ruby)

时间:2012-12-13 19:36:18

标签: ruby regex

我正在尝试使用URL(ruby)中的图像名称的第一个匹配进行正则表达式。

这是我目前的代码:

@wikimedia_link.match(/(\/|:)([a-zA-Z\_\-0-9]*\.(jpeg|jpg|png|gif))/).try(:[], 2)

如果我有一场比赛,那就有效(返回“Samuel_L_Jackson_Comic_Con.jpg”),即

http://en.wikipedia.org/wiki/File:Samuel_L_Jackson_Comic_Con.jpg

然而,这会返回一个错误(nil),似乎是因为网址中有“Lucy_desi_1957.JPG”和“220px-Lucy_desi_1957.JPG”。

http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Lucy_desi_1957.JPG/220px-Lucy_desi_1957.JPG

关于如何进行第一场比赛的任何想法?

谢谢!

4 个答案:

答案 0 :(得分:0)

如果你想在结尾添加一个$来匹配结尾。

/(/|:)([\w-\.]+\.(jpeg|jpg|png|gif)$)/i

答案 1 :(得分:0)

你想要的是:

@wikimedia_link[/[^\/:]+\.(?i:jpeg|jpg|png|gif)/]

使用(?i:...)分组切换到不区分大小写的匹配,因此jpg或JP​​G将匹配。

答案 2 :(得分:0)

我就是这样做的:

2.0.0-p247 :008 > image_url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Lucy_desi_1957.JPG/220px-Lucy_desi_1957.JPG'
 => "http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Lucy_desi_1957.JPG/220px-Lucy_desi_1957.JPG" 
2.0.0-p247 :009 > image_name = image_url.match( /[-_\w:]+\.(jpe?g|png|gif)$/i ) => #<MatchData "220px-Lucy_desi_1957.JPG" 1:"JPG"> 
2.0.0-p247 :012 > image_name.to_s
 => "220px-Lucy_desi_1957.JPG"

没有IRB:

image_url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Lucy_desi_1957.JPG/220px-Lucy_desi_1957.JPG'
image_name = image_url.match( /[-_\w:]+\.(jpe?g|png|gif)$/i );
puts image_name #=> "220px-Lucy_desi_1957.JPG"

这个解决方案是最好的,因为它派生了图像的文件名,无论是简单的URL还是简单的文件名:

http://www.anexample.com/dog.jpg

或文件名更复杂:

http://www.anexample.com/342432_large-xs_dog.jpg

或者如果在网址中多次引用图片:

http://www.anexample.com/cat.jpg/upload/342432_large-xs_dog.jpg/xs/342432_large-xs_dog.jpg

答案 3 :(得分:-2)

以下正则表达式适用于您的两个示例

/^.+\/[\w:]+\.(jpe?g|png|gif)/i

您可以使用以下

获得"http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Lucy_desi_1957.JPG"
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Lucy_desi_1957.JPG/220px-Lucy_desi_1957.JPG".match(/^.+\/[\w:]+\.(jpe?g|png|gif)/i).to_a.first

如果您刚刚使用文件名本身,请从正则表达式中删除^.+\/,将其保留为

/[\w:]+\.(jpe?g|png|gif)/i

match中使用此版本只会返回"Lucy_desi_1957.JPG"

在任何一种情况下,如果未找到匹配项,nil将返回。