正则表达式检测URL不以扩展名结尾

时间:2011-03-01 15:07:44

标签: javascript html regex

我正在使用这个正则表达式来检测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;

如果网址是单独的,它可以工作,但如果文本是例如,则不起作用:

http://www.blabla.com/sdsd.jpg文字

4 个答案:

答案 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))$)
相关问题