我正在尝试使用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
关于如何进行第一场比赛的任何想法?
谢谢!
答案 0 :(得分:0)
如果你想在结尾添加一个$来匹配结尾。
/(/|:)([\w-\.]+\.(jpeg|jpg|png|gif)$)/i
答案 1 :(得分:0)
你想要的是:
@wikimedia_link[/[^\/:]+\.(?i:jpeg|jpg|png|gif)/]
使用(?i:...)
分组切换到不区分大小写的匹配,因此jpg或JPG将匹配。
答案 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
将返回。