我正在使用这个正则表达式来检测url是否以jpg结尾:
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*^\.jpg)/ig;
它检测到网址:例如http://www.blabla.com/sdsd.jpg
但是现在我想检测到网址没有以jpg扩展名结尾,我试着用这个:
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*[^\.jpg]\b)/ig;
但只能获得http://www.blabla.com/sdsd
然后我用了这个:
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*[^\.jpg]$)/ig;
如果网址是单独的,它可以工作,但如果文本是例如,则不起作用:
答案 0 :(得分:2)
尝试使用negative lookahead。
(?!\.jpg)
你现在拥有的是什么,[^\.jpg]
说的是“任何字符但是一个句号或字母j,p或g”。
编辑以下是answer using negative look ahead and file extensions。
现在知道这是一个“网址查找器”,这是一个更好的解决方案:
// 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>';
});
}
我使用parseUri方法和slightly different RegEx来检测链接。在这两者之间,您可以通过链接或等效图像替换元素中的链接。
请注意,我的版本会使用/\.(jpg|png|gif|bmp)$/i
检查大多数图片类型,但是可以更改为使用/\.jpg$/i
显式捕获jpg。可以找到演示here。
用法应该非常简单,将函数传递给你想要解析的HTML元素。您可以使用任意数量的javascript方法(getElementByID,getElementsByTagName,...)捕获它。把它交给这个功能,它将负责其余部分。
您也可以更改它并将其添加到字符串原型中,以便可以原生调用它。这个版本可以这样执行:
String.prototype.convertUrls = function(){
var urlRegex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
return this.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>';
});
}
function convertUrls(element){
element.innerHTML = element.innerHTML.convertUrls();
}
(注意逻辑已移至原型函数,元素函数只调用新的字符串扩展名)
可以找到此工作版本here
答案 1 :(得分:0)
从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];
解码它以便规范化路径中任何%-encoded字符。
path = decodeURIComponenent(path);
最后,检查它是否以适当的扩展名结束:
return /\.jpg$/i.test(path);
}
答案 2 :(得分:0)
这是@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;
}
同样的结果:
http://jsfiddle.net/dnielF/CC9Va/
我不知道这是否是最佳解决方案,但对我有用:D谢谢!
答案 3 :(得分:0)
一般情况下,您可以检查所有扩展名(例如图片):
([^\s]+(\.(?i)(jpg|jpeg|png|gif|bmp))$)