Javascript Regex来检测URL不存在';t以扩展结束
我使用这个正则表达式来检测url是否以jpg结尾:Javascript Regex来检测URL不存在';t以扩展结束,javascript,html,regex,Javascript,Html,Regex,我使用这个正则表达式来检测url是否以jpg结尾: var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*^\.jpg)/ig; 它检测url:例如 但现在我想检测url是否以jpg扩展名结尾,我尝试以下方法: var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&a
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*^\.jpg)/ig;
它检测url:例如
但现在我想检测url是否以jpg扩展名结尾,我尝试以下方法:
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*[^\.jpg]\b)/ig;
但只得到
然后我用了这个:
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*[^\.jpg]$)/ig;
如果url是单独的,则该选项有效,但如果文本是,则不起作用,例如:
文本尝试使用
现在,[^\.jpg]
表示“除了句点或字母j、p或g以外的任何字符”
编辑下面是一个示例
更新 现在知道这是一个“url查找器”,这里有一个更好的解决方案:
// parseUri 1.2.2
// (c) Steven Levithan <stevenlevithan.com>
// MIT License
// --- http://blog.stevenlevithan.com/archives/parseuri
function parseUri (str) {
var o = parseUri.options,
m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
uri = {},
i = 14;
while (i--) uri[o.key[i]] = m[i] || "";
uri[o.q.name] = {};
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
if ($1) uri[o.q.name][$1] = $2;
});
return uri;
};
parseUri.options = {
strictMode: false,
key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
q: {
name: "queryKey",
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
},
parser: {
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
}
};//end parseUri
function convertUrls(element){
var urlRegex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
element.innerHTML = element.innerHTML.replace(urlRegex,function(url){
if (parseUri(url).file.match(/\.(jpg|png|gif|bmp)$/i))
return '<img src="'+url+'" alt="'+url+'" />';
return '<a href="'+url+'">'+url+'</a>';
});
}
(注意,逻辑已经移到原型函数,元素函数只调用新的字符串扩展名)
此工作修订版可从RFC 3986附录中找到定义URL正则表达式:
function hasJpgExtension(myUrl) {
var urlRegex = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
var match = myUrl.match(urlRegex);
if (!match) { return false; }
白名单协议
if (!/^https?/i.test(match[2])) { return false; }
抓取路径部分,以便可以过滤掉查询和片段
var path = match[5];
对其进行解码以规范化路径中的任何编码字符
path = decodeURIComponenent(path);
最后,检查它是否以适当的扩展名结束:
return /\.jpg$/i.test(path);
}
这是一个来自@Brad的帖子的简单解决方案,不需要parseUri函数:
function convertUrls(text){
var urlRegex = /((\b(https?|ftp|file):\/\/|www)[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
var result = text.replace(urlRegex,function(url){
if (url.match(/\.(jpg|png|gif|bmp)$/i))
return '<img width="185" src="'+url+'" alt="'+url+'" />';
else if(url.match(/^(www)/i))
return '<a href="http://'+url+'">'+url+'</a>';
return '<a href="'+url+'">'+url+'</a>';
});
return result;
}
函数转换URL(文本){
var urlRegex=/(\b(https?| ftp |文件):\/\/\/| www)[-A-Z0-9+&@#\/%?=~~|!:,.;]*[-A-Z0-9+&@#\/%=~|]/ig;
var result=text.replace(urlRegex,函数(url){
if(url.match(/\(jpg | png | gif | bmp)$/i))
返回“”;
else if(url.match(/^(www)/i))
返回“”;
返回“”;
});
返回结果;
}
同样的结果:
我不知道这是否是最好的解决方案,但对我来说有效:D谢谢 通常,您可以使用类似的工具检查所有扩展名(图片):
如果URL有一个片段或查询,或者扩展名中的任何字符都是百分比编码的,那么这将没有帮助。@MikeSamuel:我看不到他们的正则表达式也这样做。“我不知道这必须是一个防弹的解决方案。”布拉德,不能处理碎片似乎是一个相当严重的缺点。这不仅仅是防弹的,而且是易碎的。@MikeSamuel:除非你知道OP的意图以及他们在哪里使用解决方案,否则这可能是必要的,也可能不是必要的,而且(在这一点上)是推测性的。不管是哪种方式,解决方案都是使用一个消极的前瞻性,将“正确的url格式”放在一边。(?\.jpg)…$它可以工作,但如果我有“http://www.blablabla.com/sdsd.jpg text”,就不要检测。(这是替换url宽度和图像url宽度的脚本的一部分)实际上,您不需要这样做。我本可以提取正则表达式,但我觉得有义务给原作者一点荣誉。另外,我不认为你会在带有get变量的链接中检测到图像(例如,
foo.jpg?bar=foobar
),但如果它对你有效,那就这样吧
return /\.jpg$/i.test(path);
}
function convertUrls(text){
var urlRegex = /((\b(https?|ftp|file):\/\/|www)[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
var result = text.replace(urlRegex,function(url){
if (url.match(/\.(jpg|png|gif|bmp)$/i))
return '<img width="185" src="'+url+'" alt="'+url+'" />';
else if(url.match(/^(www)/i))
return '<a href="http://'+url+'">'+url+'</a>';
return '<a href="'+url+'">'+url+'</a>';
});
return result;
}
([^\s]+(\.(?i)(jpg|jpeg|png|gif|bmp))$)