0

我正在尝试正则表达式 URL(红宝石)中图像名称的第一个匹配项。

这是我当前的代码:

@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),似乎是因为 url 中有“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

4 回答 4

0

你想要的是:

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

使用(?i:...)分组开关进行不区分大小写的匹配,因此将匹配 jpg 或 JPG。

于 2012-12-13T21:05:18.207 回答
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

或者如果在 URL 中多次引用图像:

http://www.anexample.com/cat.jpg/upload/342432_large-xs_dog.jpg/xs/342432_large-xs_dog.jpg
于 2014-03-15T13:38:01.650 回答
0

如果您希望文件名在末尾添加一个 $ 以匹配末尾。

/(/|:)([\w-\.]+\.(jpeg|jpg|png|gif)$)/i
于 2012-12-13T20:48:27.983 回答
-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将返回。

于 2012-12-13T19:42:38.930 回答