正则表达式检查有效的URL是否以.jpg,.png或.gif结尾

时间:2008-10-04 02:53:57

标签: regex image url

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

12 个答案:

答案 0 :(得分:69)

(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:jpg|gif|png))(?:\?([^#]*))?(?:#(.*))?

这是来自RFC 2396的正式URI解析正则表达式的(稍加修改)版本。它允许#fragments?querystrings出现在文件名之后,这可能是您想要的,也可能不是。它还匹配任何有效的域,包括localhost,这可能不是您想要的,但可以修改。

对此更传统的正则表达式可能如下所示。

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

编辑请参阅我的other comment,虽然我没有完全回答这个问题,但我认为在这种情况下它可能更有用。但是,我将此处留给 karma-whoring 完整性原因。

答案 1 :(得分:37)

实际上

为什么要检查网址?这并不能保证你得到的是一张图片,并且不能保证你拒绝的东西不是图像。尝试对其执行HEAD请求,并查看实际的内容类型。

答案 2 :(得分:13)

通常,您最好使用内置库或框架函数验证URL,而不是滚动自己的正则表达式来执行此操作 - 有关详细信息,请参阅What is the best regular expression to check if a string is a valid URL

如果你热衷于这样做,请查看这个问题:

Getting parts of a URL (Regex)

然后,一旦您对URL(通过您用于验证它的任何方式)感到满意,您可以使用简单的“endswith”类型字符串运算符来检查扩展名,或者使用简单的正则表达式

(?i)\.(jpg|png|gif)$

答案 3 :(得分:13)

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

这将填充此字符串中的所有图像:

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;

在此处测试您的正则表达式:https://regex101.com/r/l2Zt7S/1

答案 4 :(得分:2)

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

#!/usr/bin/perl

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

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

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

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

print "It's an image!\n" if $class eq 'image';

如果您需要检查URL,请使用实体库,而不是尝试自己处理所有奇怪的情况:

use URI;

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

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

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

print "My extension is $extension\n";

祝你好运,:))

答案 5 :(得分:2)

如果确实想要确定,抓住第一个或两个给定的网址应足以确定您需要了解的有关该图像的所有内容。

这是an example of how you can get that information,使用Python,这里是an example of it being put to use, as a Django form field,它允许您根据网址轻松验证图片的存在,文件大小,尺寸和格式。

答案 6 :(得分:2)

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

这将匹配以下形式的网址:

https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.jpg
http://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.jpg
https://farm4.staticflickr.com/3894/15008518202-c265dfa55f-h.jpg
https://farm4.staticflickr.com/3894/15008518202.c265dfa55f.h.jpg
https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.gif
http://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.gif
https://farm4.staticflickr.com/3894/15008518202-c265dfa55f-h.gif
https://farm4.staticflickr.com/3894/15008518202.c265dfa55f.h.gif
https://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.png
http://farm4.staticflickr.com/3894/15008518202_c265dfa55f_h.png
https://farm4.staticflickr.com/3894/15008518202-c265dfa55f-h.png
https://farm4.staticflickr.com/3894/15008518202.c265dfa55f.h.png

根据以下网址检查此正则表达式:http://regexr.com/3g1v7

答案 7 :(得分:1)

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

答案 8 :(得分:0)

使用FastImage - 它会从网址中获取所需的最少数据,以确定它是图像,图像类型和大小。

答案 9 :(得分:0)

添加Dan's答案。

如果有IP地址而不是域。

改变正则表达式。 (有效IPv4和IPv6的临时解决方案)

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

但是,这可以改进,IPv4和IPv6可以验证子网范围。

答案 10 :(得分:0)

此表达式将匹配所有图像网址-

+---+----------------------------+
|id |col1                        |
+---+----------------------------+
|1  |1$2$3, 5$7$ 9               |
|2  |4$5$6, 7$8$9, 10$11$12      |
+---+----------------------------+

示例-

有效-

^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+(?:png|jpg|jpeg|gif|svg)+$

无效-

https://itelligencegroup.com/wp-content/usermedia/de_home_teaser-box_puzzle_in_the_sun.png
http://sweetytextmessages.com/wp-content/uploads/2016/11/9-Happy-Monday-images.jpg
example.com/de_home_teaser-box_puzzle_in_the_sun.png
www.example.com/de_home_teaser-box_puzzle_in_the_sun.png
https://www.greetingseveryday.com/wp-content/uploads/2016/08/Happy-Independence-Day-Greetings-Cards-Pictures-in-Urdu-Marathi-1.jpg
http://thuglifememe.com/wp-content/uploads/2017/12/Top-Happy-tuesday-quotes-1.jpg
https://1.bp.blogspot.com/-ejYG9pr06O4/Wlhn48nx9cI/AAAAAAAAC7s/gAVN3tEV3NYiNPuE-Qpr05TpqLiG79tEQCLcBGAs/s1600/Republic-Day-2017-Wallpapers.jpg

答案 11 :(得分:0)

参考:请参阅官方go lang image lib文档here

上的DecodeConfig部分。

我相信您也可以使用DecodeConfig来获取图像的格式,然后可以针对jpeg,png,jpg和gif等const类型进行验证,

import (
  "encoding/base64"
  "fmt"
  "image"
  "log"
  "strings"
  "net/http"

  // Package image/jpeg is not used explicitly in the code below,
  // but is imported for its initialization side-effect, which allows
  // image.Decode to understand JPEG formatted images. Uncomment these
  // two lines to also understand GIF and PNG images:
  // _ "image/gif"
  // _ "image/png"
  _ "image/jpeg"
   )

func main() {
  resp, err := http.Get("http://i.imgur.com/Peq1U1u.jpg")
  if err != nil {
      log.Fatal(err)
  }
  defer resp.Body.Close()
  data, _, err := image.Decode(resp.Body)
  if err != nil {
      log.Fatal(err)
  }
  reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
  config, format, err := image.DecodeConfig(reader)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("Width:", config.Width, "Height:", config.Height, "Format:", format)
}

format是一个说明文件格式的字符串,例如jpg,png等