Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regex来检测URL不存在';t以扩展结束_Javascript_Html_Regex - Fatal编程技术网

Javascript Regex来检测URL不存在';t以扩展结束

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

我使用这个正则表达式来检测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+&@#\/%=~_|]*[^\.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))$)