将用户特定的URL列表与当前URL进行比较?

时间:2015-03-08 18:25:30

标签: javascript arrays regex url google-chrome-extension

我有一个白名单,用户可以在其中输入特定的网址/网址格式(仅定位httphttps

我想转换并比较这些网址/网址格式,以便可以像这样使用通配符选择器*

  

用户输入: example.*/test

     

我想将其转换为: *//*.example.*/test

     

以便匹配: http://www.example.com/testhttps://example.co.uk/test

另一个例子:

  

用户输入: http://www.*.com/*

     

我想将其转换为: http://www.*.com/*

     

以便匹配: http://www.blah.com/testhttp://www.other.com/null.html

  

用户输入: www.example.com/*

     

我想将其转换为: *//www.example.com/*

     

以便匹配: http://www.example.com/testtwohttps://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;
  },
  1. 首先,正则表达式转换符合最终案例(例如example.com/*但不符合example.*/about

  2. 等类型
  3. 这是Chrome扩展程序的一部分,是否有更好/更简单的方法可以使用内置方法?

  4. 感谢您提前提供任何帮助。

3 个答案:

答案 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?如果它按预期工作:

&#13;
&#13;
new RegExp('example.com/*').test('http://example.com/aaaa')
&#13;
&#13;
&#13;

只需在白名单中的每个项目中创建正则表达式

&#13;
&#13;
whitelist.forEach(function(item) {
  new RegExp(item).match(URL);
});
&#13;
&#13;
&#13;