2017-07-13 57 views
-1

是否有已知的JavaScript正則表達式來匹配整個URL連接字符串?正則表達式的URL連接字符串

protocol://user:[email protected]:12345/segment1/segment2?p1=val1&p2=val2 

我正在尋找一個正則表達式,這將有助於我這樣一個連接字符串轉換成一個對象:

{ 
    protocol: 'protocol', 
    user: 'user', 
    password: 'password', 
    host: 'hostname:12345', 
    hostname: 'hostname', 
    port: 12345, 
    segments: ['segment1', 'segment2'], 
    params: { 
     p1: 'val1', 
     p2: 'val2' 
    } 
} 

另外,我想連接字符串的每一個部分是可選,所以缺少的參數可以由環境中的值填充。

例子:

標準RFC 3986規則應適用於所有的部位,當涉及到有效符號。

我正在尋找可以在Node.js和所有瀏覽器中工作的東西。

我在connection-string內完成了一個單獨的解析,但問題在於 - 它不允許驗證,即告訴整個事情是否有效。

+1

的【如何解析URL?](https://stackoverflow.com/questions/6168260/how-to-parse-a-url) –

+0

愚弄的人@WiktorStribiżew有沒有答案,那將支持URL的所有部分是可選的,按照我的例子。 –

+1

我不認爲正則表達式是這個問題的一個好主意。你爲什麼不手動解析URL然後構造所需的對象? –

回答

1

是這樣的?

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:[email protected]:12345/segment1/segment2?p1=val1&p2=val2")); 
 
console.log(url2obj("http://hostname")); 
 
console.log(url2obj(":[email protected]")); 
 
console.log(url2obj("?p1=val1")); 
 
console.log(url2obj("ftp://usr:[email protected][FFF::12]:345/testIP6"));

+0

這是一個絕妙的答案,謝謝!我到目前爲止唯一遇到的問題 - 當它是IPv6時,無法正確識別「host/hostname」,對於URL-s,在方括號內指定,如下所示:'[12ab:1234 ::] ',可以和'[::]'一樣短,只要45個字符。 –

+0

沒關係,我自己修復了它。再次,很好的答案,謝謝! –

+1

@ vitaly-t哦,對,從主機獲得主機名稱時會出現「:」的分割,這會給IP6帶來錯誤的結果,因爲那些字符包含該字符。我想你會想到如何從捕獲組3中提取整個IP6。順便說一下,我微調了一下正則表達式。 – LukStorms