我有一个白名单,用户可以在其中输入特定的网址/网址格式(仅定位http
和https
。
我想转换并比较这些网址/网址格式,以便可以像这样使用通配符选择器(*
)
用户输入:
example.*/test
我想将其转换为:
*//*.example.*/test
以便匹配:
http://www.example.com/test
,https://example.co.uk/test
另一个例子:
用户输入:
http://www.*.com/*
我想将其转换为:
http://www.*.com/*
以便匹配:
http://www.blah.com/test
,http://www.other.com/null.html
和
用户输入:
www.example.com/*
我想将其转换为:
*//www.example.com/*
以便匹配:
http://www.example.com/testtwo
,https://www.example.com/arfg
我想插入一个主要协议(如果它没有被用户包含)的原因是因为我使用它来与当前标签URL进行比较。
我得到了这个URL字符串数组,并希望将它们与当前网址进行比较,但是在匹配所有用例时遇到了问题:
"isNotWhitelisted" : function(){
var whitelist = MyObject.userLists.whitelist;
var currentUrl = document.location.href;
for(var i=0; i<whitelist.length; i++){
var regexListItem = new RegExp(whitelist[i].toString().replace(".", "\\.").replace("*", ".+"));
if(currentUrl.match(regexListItem)) {
return false;
}
}
return true;
},
首先,正则表达式转换符合最终案例(例如example.com/*
但不符合example.*/about
这是Chrome扩展程序的一部分,是否有更好/更简单的方法可以使用内置方法?
感谢您提前提供任何帮助。
答案 0 :(得分:1)
whitelist.forEach(function(listItem){
var rgx = new RegExp(listItem.replace(/\./g,'\\.').replace(/\*/g,'.*'));
if(rgx.test(url)) {
// current URL matches URL/URL pattern in whitelist array!
}
})
如果你不替换,'www。*。com'模式也与'wwwocom'匹配。
如果您想使用其他特殊字符,可以使用:
var rgx = new RegExp(listItem.replace(/(\.|\[|\]|\{|\}|\(|\)|\+|\?|\\|\$|\^)/g,'\\$1').replace(/\*/g,'.*'));
答案 1 :(得分:1)
如果您想要贪婪的匹配,我认为您需要请求用户以这种格式输入模式:*://*/*
您可以这样检查:
var special_char_rgx = /(\.|\[|\]|\{|\}|\(|\)|\+|\?|\\|\/|\$|\^|\|)/g; // I think that all...
var asterisk_rgx = /\*/g;
var pattern_rgx = /^([^:\/]+):\/\/([^\/]+)\/(.*)$/g;
function addPatern(pattern, whitelist) {
var str_pattern = pattern.replace(asterisk_rgx,'\\*');
var isMatch = pattern_rgx.test(str_pattern);
if (isMatch) {
pattern = pattern.replace(special_char_rgx,'\\$1').replace(asterisk_rgx, '.+');
whitelist.push(new RegExp('^'+pattern + '$'));
}
pattern_rgx.lastIndex = 0; // Otherwise RegExp.test save this value and destroy the tests!
return isMatch;
}
如果你想以不同的方式处理协议/域/路径,你可以这样做:
if (isMatch) {
var protocol = RegExp.$1;
var domain= RegExp.$2;
var path_query = RegExp.$3;
// Your logic...
}
答案 2 :(得分:-1)
嗯,m.b。从白名单项创建RegExp?如果它按预期工作:
new RegExp('example.com/*').test('http://example.com/aaaa')
&#13;
只需在白名单中的每个项目中创建正则表达式
whitelist.forEach(function(item) {
new RegExp(item).match(URL);
});
&#13;