【发布时间】:2010-09-15 05:44:55
【问题描述】:
我希望用户提交一个有效但也是图片的 URL,以 .jpg、.png 或 .gif 结尾。
【问题讨论】:
-
“jpeg”呢?
-
“somescript.php?image_id=12345”怎么样?
我希望用户提交一个有效但也是图片的 URL,以 .jpg、.png 或 .gif 结尾。
【问题讨论】:
(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\.(?:jpg|gif |png))(?:\?([^#]*))?(?:#(.*))?
这是来自RFC 2396 的官方 URI 解析正则表达式的(稍作修改)版本。它允许#fragments 和?querystrings 出现在文件名之后,这可能是也可能不是您想要的。它还匹配任何有效域,包括 localhost,这可能不是您想要的,但可以修改。
一个更传统的正则表达式可能如下所示。
^https?://(?:[a-z0-9\-]+\.)+[az]{2,6}(?:/[^/#?]+)+\.( ?:jpg|gif|png)$
|-------- 域 -----------|--- 路径 ---|-- 扩展名 ---|
编辑见我的other comment,虽然它没有像这个一样完整地回答这个问题,但我觉得在这种情况下它可能更有用。但是,出于 karma-whoring 完整性的原因,我将把它留在这里。
【讨论】:
^((http(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|png|gif))
【讨论】:
一般来说,您最好使用内置库或框架函数来验证 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)$
【讨论】:
其实。
为什么要检查 URL?这不能保证您将获得的是图像,也不能保证您拒绝的东西不是图像。尝试对其执行 HEAD 请求,看看它实际上是什么内容类型。
【讨论】:
这是 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";祝你好运,:)
【讨论】:
如果您真的想确定,获取给定 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 轻松验证图像的存在、文件大小、尺寸和格式。
【讨论】:
(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 中的破折号。
使用FastImage - 它会从 URL 中获取最少需要的数据,以确定它是否是图像、图像的类型和大小。
【讨论】:
添加到Dan's 答案。
稍微改变正则表达式。 (有效 IPv4 和 IPv6 的临时解决方案)
^https?://(?:[a-z0-9\-]+\.)+[a-z0-9]{2,6}(?:/[^/#?]+)+\.(?:jpg|gif|png)$
但是,这可以改进,以便 IPv4 和 IPv6 验证子网范围。
【讨论】:
(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
【讨论】:
这个表达式将匹配所有的图片 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
【讨论】:
参考:参见官方 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 等
【讨论】:
只是提供更好的解决方案。您可以验证 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));
}
【讨论】:
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);
【讨论】: