正则expression式检查以.jpg,.png或.gif结尾的有效URL

我希望用户提交一个有效的url,但也是一个图片,以.jpg,.png或.gif结尾。

  ?(?://([?^ /#] *))?(?:([?^:/#] +))([?^#] * \(:?JPG | GIF | PNG) )(?:?\([^#] *))?(?:#(*))? 

这是RFC 2396官方URIparsing正则expression式(略微修改)的版本。 它允许在文件名后面出现#fragments?querystrings ,这可能是也可能不是你想要的。 它也匹配任何有效的域,包括localhost ,这可能不是你想要的,但它可以被修改。

更传统的正则expression式可能如下所示。

  ^ HTTPS://??(?:[A-Z0-9 \  - ] + \)+ [AZ] {2,6-}(?:[?^ /#] / +)+ \(:JPG | GIF | PNG)$
           | --------域----------- | ---path--- |  - 扩展名--- | 

编辑看到我的其他评论 ,虽然没有像这个完全回答这个问题,我觉得这可能是在这种情况下更有用。 但是,我要离开这里 卡玛 – 嫖娼 完整性原因。

其实。

你为什么要检查url? 这不能保证你将得到的是一张图片,也不能保证你拒绝的东西不是图片。 尝试对其执行HEAD请求,并查看它实际上是什么内容types。

一般来说,最好使用内置库或框架函数validationURL,而不是滚动自己的正则expression式来执行此操作 – 请参阅什么是检查string是否为有效URL的最佳正则expression式以了解详细信息。

如果你热衷于这样做,但是,看看这个问题:

获取URL的部分(正则expression式)

然后,一旦你对URL感到满意(通过你用来validation它的任何方法),你可以使用简单的“endswith”types的string操作符来检查扩展,或者像一个简单的正则expression式

 (?i)\.(jpg|png|gif)$ 
 (http(s?):)|([/|.|\w|\s])*\.(?:jpg|gif|png) 

这将从这个string加工所有图像:

 background: rgb(255, 0, 0) url(../res/img/temp/634043/original/cc3d8715eed0c.jpg) repeat fixed left top; cursor: auto; <div id="divbg" style="background-color:#ff0000"><img id="bg" src="../res/img/temp/634043/original/cc3d8715eed0c.jpg" width="100%" height="100%" /></div> background-image: url(../res/img/temp/634043/original/cc3d8715eed0c.png); background: rgb(255, 0, 0) url(http://google.com/res/../img/temp/634043/original/cc3 _d8715eed0c.jpg) repeat fixed left top; cursor: auto; background: rgb(255, 0, 0) url(https://google.com/res/../img/temp/634043/original/cc3_d8715eed0c.jpg) repeat fixed left top; cursor: auto; 

在这里testing你的正则expression式: https : //regex101.com/r/l2Zt7S/1

这是Perl的基本思想。 盐味道。

 #!的/ usr / bin中/ perl的

使用LWP :: UserAgent;

我的$ ua = LWP :: UserAgent-> new;

 @ARGV = qw(http://www.example.com/logo.png);

我的$ response = $ ua-> head($ ARGV [0]);

 my($ class,$ type)= split m | / |,lc $ response-> content_type;

打印“这是一个图像!\ n”如果$ class eq'image';

如果您需要检查url,请使用一个坚实的库,而不是自己处理所有奇怪的情况:

使用URI;

我的$ uri = URI-> new($ ARGV [0]);

 my $ last =($ uri-> path_segments)[ -  1];

 my($ extension)= $ last =〜m /\.([^.]+)$/ g;

打印“我的扩展名是$扩展名\ n”;

祝你好运, :)

如果你确实想要确定,抓住给定URL的第一个或第二个字节就足以确定你需要了解的图像的一切。

下面是一个如何使用Python 获取这些信息 的例子,以下是一个Django表单字段的例子,它允许您根据URL来轻松validation图像的存在,文件大小,尺寸和格式。

 ^((http(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|png|gif)) 

使用FastImage – 它会从URL中获取所需的最小数据,以确定它是否为图像,图像types以及尺寸。

除了丹的答案。

如果有一个IP地址,而不是域。

改变一下正则expression式。 (有效的IPv4和IPv6临时解决scheme)

 ^https?://(?:[a-z0-9\-]+\.)+[a-z0-9]{2,6}(?:/[^/#?]+)+\.(?:jpg|gif|png)$ 

但是,这可以改进,IPv4和IPv6validation子网范围。

(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|gif|png)对我来说真的很好。

这将匹配以下forms的URL:

 3894/15008518202_c265dfa55f_h.png 

在这里查看这个正则expression式的URL: http : //regexr.com/3g1v7