2016-08-23 82 views
1

我正在編寫一個Chrome擴展程序,允許用戶修改特定網站上的內容。我希望用戶能夠指定使用通配符這些網站,例如http://*.google.comhttp://google.com/*Javascript與通配符匹配的網址 - Chrome擴展程序

我發現下面的代碼

currentUrl = "http://google.com/"; 
matchUrl = "http://*.google.com/*"; 
match = RegExp(matchUrl.replace(/\*/g, "[^]*")).test(currentUrl); 

但它存在一些問題。

http://test.google.com/匹配

http://google.com/不匹配

http://test.google.com是不是一個匹配

http://.google.com/匹配

澄清:

http://google.com是不是一個匹配,這是真正的問題。

那麼我該如何創建一個JavaScript代碼片段來檢查是否存在正確匹配?

+1

有什麼不好的結果嗎? – melpomene

+0

我想你應該首先解析URL,然後用'(?:[^ /] * \。)?'替換'* .'在基部和'/ *'中用'(?:/ [^] *)?'。也許,一個好主意是首先逃避特殊字符。 –

+0

正則表達式應該是['/http:\/\/(?:[^\/]*\.??google\.com(?:\/[^]*)?/'](https:// regex101.com/r/jB2rK7/1)。 –

回答

2

我建議將URL解析爲協議,基本部分和其餘部分,然後重新構建替換*的驗證正則表達式,替換爲(?:[^/]*\\.)*(?:/[^]*)?。此外,你必須通過.replace(/[?()[\]\\.+^$|]/g, "\\$&")逃脫所有其他特殊字符。您還需要錨(^用於字符串的開始,$用於字符串位置的末尾)以匹配整個字符串。不區分大小寫的/i修飾符只是使模式不區分大小寫的好處。

所以,對於這個確切matchUrl,正則表達式看起來像

/^http:\/\/(?:[^\/]*\.)*google\.com(?:\/[^]*)?$/ 

regex demo

var rxUrlSplit = /((?:http|ftp)s?):\/\/([^\/]+)(\/.*)?/; 
 
var strs = ['http://test.google.com/', 'http://google.com/','http://test.google.com', 'http://.google.com/','http://one.more.test.google.com']; 
 
var matchUrl = "http://*.google.com/*"; 
 
var prepUrl = ""; 
 
if ((m=matchUrl.match(rxUrlSplit)) !== null) { 
 
\t prepUrl = m[1]+"://"+m[2].replace(/[?()[\]\\.+^$|]/g, "\\$&").replace(/\*\\./g,'(?:[^/]*\\.)*').replace(/\*$/,'[^/]*'); 
 
    if (m[3]) { 
 
     prepUrl+= m[3].replace(/[?()[\]\\.+^$|]/g, "\\$&").replace(/\/\*(?=$|\/)/g, '(?:/[^]*)?'); 
 
    } 
 
} 
 
if (prepUrl) { 
 
// console.log(prepUrl); // ^http://(?:[^/]*\.)*google\.com(?:/[^]*)?$ 
 
    var rx = RegExp("^" + prepUrl + "$", "i"); 
 
    for (var s of strs) { 
 
    if (s.match(rx)) { 
 
    \t console.log(s + " matches!<br/>"); 
 
    } else { 
 
    \t console.log(s + " does not match!<br/>"); 
 
    } 
 
    } 
 
}

+1

謝謝先生,那正是我正在尋找的。 –

-1

與此matchUrl

matchUrl = "http://*.google.com/*"; 

的RexExp是這樣

"http://.*.google.com/.*" 

所以嘗試更換*通過用戶與輸入。*在正則表達式匹配

您可以使用this工具對其進行測試

+0

您還沒有對所有輸入字符串進行過嘗試。 *。*之後的'。* *需要*一個字符。 –

+0

@Wiktor我不明白我錯過了什麼。 – Alberto

+0

@WiktorStribiżew是對的。 'http:// google.com'不會匹配 –