【问题标题】:Regex to check if valid URL that ends in .jpg, .png, or .gif正则表达式检查是否以 .jpg、.png 或 .gif 结尾的有效 URL
【发布时间】:2010-09-15 05:44:55
【问题描述】:

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

【问题讨论】:

标签: regex image url


【解决方案1】:
(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:jpg|gif |png))(?:\?([^#]*))?(?:#(.*))?

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

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

^https?://(?:[a-z0-9\-]+\.)+[az]{2,6}(?:/[^/#?]+)+\.( ?:jpg|gif|png)$
          |-------- 域 -----------|--- 路径 ---|-- 扩展名 ---|

编辑见我的other comment,虽然它没有像这个一样完整地回答这个问题,但我觉得在这种情况下它可能更有用。但是,出于 karma-whoring 完整性的原因,我将把它留在这里。

【讨论】:

  • 将“jpg”替换为“jpe?g”,并在正则表达式上设置不区分大小写的标志。
  • 这只有在 URL 确实有效时才真正有用。我无法计算在 URL 中出现“非法”字符的次数,尤其是文件名中的空格。
  • 我第二个@PlexQ。是否有统一的正则表达式来检查网址是否有效并且是图片网址?
  • 这非常有用。我正在根据扩展名匹配 url。谢谢你
【解决方案2】:
^((http(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|png|gif))

【讨论】:

    【解决方案3】:

    一般来说,您最好使用内置库或框架函数来验证 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)$
    

    【讨论】:

    • 非常好的电话!这是我做的孩子们:1)使用JQuery的验证docs.jquery.com/Plugins/Validation 2)将此正则表达式添加到URL的末尾,并将其重命名为“urlphoto”就像一个魅力!干得好
    【解决方案4】:

    其实。

    为什么要检查 URL?这不能保证您将获得的是图像,也不能保证您拒绝的东西不是图像。尝试对其执行 HEAD 请求,看看它实际上是什么内容类型。

    【讨论】:

    • 根据您对 URL 背后数据的偏执程度,您可能希望超越 HEAD 并获取(所谓的)图像的全部内容,然后使用图像处理库确认它是它声称的那样。
    • 这甚至不能保证图像仍然存在并且在将 URL 提供给浏览器时实际上是图像。
    【解决方案5】:

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

    #!/usr/bin/perl 使用 LWP::UserAgent; 我的 $ua = LWP::UserAgent->new; @ARGV = qw(http://www.example.com/logo.png); 我的 $response = $ua->head($ARGV[0]); 我的($class, $type) = 拆分 m|/|, lc $response->content_type; print "这是一张图片!\n" if $class eq 'image';

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

    使用 URI; 我的 $uri = URI->new($ARGV[0]); 我的 $last = ( $uri->path_segments )[-1]; 我的( $extension ) = $last =~ m/\.([^.]+)$/g; print "我的扩展名是 $extension\n";

    祝你好运,:)

    【讨论】:

      【解决方案6】:

      如果您真的想确定,获取给定 URL 的前一两个千字节应该足以确定您需要了解的有关图像的所有信息。

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

      【讨论】:

        【解决方案7】:
        (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

        【讨论】:

        • 在目录/文件名中用连字符分割路径
        • (http(s?):)([/|.|\w|\s|-])*\.(?:jpg|gif|png) 的性能稍好一些。它需要在 URL 中找到的 http(s)(而不是可选的)。此外,它还支持 URL 中的破折号。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          添加到Dan's 答案。

          如果有IP地址而不是域。

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

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

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

          【讨论】:

            【解决方案10】:

            (http(s?):)([/|.|\w|\s|-])*\.(?:jpg|gif|png) 非常适合我。

            这将匹配以下形式的 URL:

            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
            

            在此处对照 URL 检查此正则表达式:http://regexr.com/3g1v7

            【讨论】:

              【解决方案11】:

              这个表达式将匹配所有的图片 url -

              ^(?: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
              

              无效 -

              https://www.example.com
              http://www.example.com
              www.example.com
              example.com
              http://blog.example.com
              http://www.example.com/product
              http://www.example.com/products?id=1&page=2
              http://www.example.com#up
              http://255.255.255.255
              255.255.255.255
              http://invalid.com/perl.cgi?key= | http://web-site.com/cgi-bin/perl.cgi?key1=value1&key2
              http://www.siteabcd.com:8008
              

              【讨论】:

                【解决方案12】:

                参考:参见官方 go lang image lib 文档here中的 DecodeConfig 部分

                我相信您也可以使用 DecodeConfig 来获取图像的格式,然后您可以针对 jpeg、png、jpg 和 gif ie 等 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)
                }
                

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

                【讨论】:

                  【解决方案13】:

                  只是提供更好的解决方案。您可以验证 uri 并检查格式然后:

                  public class IsImageUriValid
                  {
                      private readonly string[] _supportedImageFormats =
                      {
                          ".jpg",
                          ".gif",
                          ".png"
                      };
                  
                      public bool IsValid(string uri)
                      {
                          var isUriWellFormed = Uri.IsWellFormedUriString(uri, UriKind.Absolute);
                  
                          return isUriWellFormed && IsSupportedFormat(uri);
                      }
                  
                      private bool IsSupportedFormat(string uri) => _supportedImageFormats.Any(supportedImageExtension => uri.EndsWith(supportedImageExtension));
                  }
                  

                  【讨论】:

                    【解决方案14】:
                        const url = "https://www.laoz.com/image.png";
                        const acceptedImage = [".png", ".jpg", ".gif"];
                        const extension = url.substring(url.lastIndexOf("."));
                        const isValidImage = acceptedImage.find((m) => m === extension) != null;
                        console.log("isValidImage", isValidImage);
                        console.log("extension", extension);
                    
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-04-20
                      • 1970-01-01
                      • 2013-04-29
                      • 1970-01-01
                      • 2015-05-06
                      • 2020-05-07
                      • 1970-01-01
                      • 2011-07-06
                      相关资源
                      最近更新 更多