2016-08-23 107 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'不会匹配 –