URL连接字符串的正则表达式

vit*_*y-t 0 javascript regex

是否存在一个已知的JavaScript正则表达式来匹配整个URL连接字符串?

protocol://user:password@hostname:12345/segment1/segment2?p1=val1&p2=val2
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个正则表达式,它将帮助我将这样的连接字符串转换为对象:

{
    protocol: 'protocol',
    user: 'user',
    password: 'password',
    host: 'hostname:12345',
    hostname: 'hostname',
    port: 12345,
    segments: ['segment1', 'segment2'],
    params: {
        p1: 'val1',
        p2: 'val2'
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,我希望连接字符串的每个部分都是可选的,因此缺少的参数可以由环境中的值填充。

例子:

  • protocol://
  • server:12345
  • :12345 -仅用于端口
  • user:password@
  • user@
  • :password@
  • /segment1
  • ?p1=val1
  • 等等...

关于有效符号,标准RFC 3986规则应适用于所有零件。

我正在寻找可以在Node.js和所有浏览器中使用的东西。

我已经在connection-string中逐个进行了单独的解析,但是有一个问题-它不允许验证,即无法确定整个事情是否有效。

Luk*_*rms 5

像这样吗?

function url2obj(url) {
    var pattern = /^(?:([^:\/?#\s]+):\/{2})?(?:([^@\/?#\s]+)@)?([^\/?#\s]+)?(?:\/([^?#\s]*))?(?:[?]([^#\s]+))?\S*$/;
    var matches =  url.match(pattern);
    var params = {};
    if (matches[5] != undefined) { 
       matches[5].split('&').map(function(x){
         var a = x.split('=');
         params[a[0]]=a[1];
       });
    }

    return {
        protocol: matches[1],
        user: matches[2] != undefined ? matches[2].split(':')[0] : undefined,
        password: matches[2] != undefined ? matches[2].split(':')[1] : undefined,
        host: matches[3],
        hostname: matches[3] != undefined ? matches[3].split(/:(?=\d+$)/)[0] : undefined,
        port: matches[3] != undefined ? matches[3].split(/:(?=\d+$)/)[1] : undefined,
        segments : matches[4] != undefined ? matches[4].split('/') : undefined,
        params: params 
    };
}

console.log(url2obj("protocol://user:password@hostname:12345/segment1/segment2?p1=val1&p2=val2"));
console.log(url2obj("http://hostname"));
console.log(url2obj(":password@"));
console.log(url2obj("?p1=val1"));
console.log(url2obj("ftp://usr:pwd@[FFF::12]:345/testIP6"));
Run Code Online (Sandbox Code Playgroud)

  • @vitaly-t Heh,太棒了。做得好!:) 顺便说一句,很少有人对答案进行投票的人会展示他们用它做了什么。所以这让我微笑。 (2认同)