Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是在javascript中匹配15000个URL主机名的最有效方法吗_Javascript_Regex - Fatal编程技术网

这是在javascript中匹配15000个URL主机名的最有效方法吗

这是在javascript中匹配15000个URL主机名的最有效方法吗,javascript,regex,Javascript,Regex,我正在使用window.location.hostname获取主机名。我想对照已知主机名检查主机名,这些主机名来自f-n-b.com、td.com、shopping.abc.business、key.com、google.com等列表,总共有15000台主机。我有名单。如果主机名匹配,则函数应返回true。所以我用了很多|| 'https?:\/\/([a-z0-9]+[.])*td.com' 我使用的是正则表达式“https?://[a-z0-9]+[.]*td.com” 剧本似乎很慢。这是

我正在使用window.location.hostname获取主机名。我想对照已知主机名检查主机名,这些主机名来自f-n-b.com、td.com、shopping.abc.business、key.com、google.com等列表,总共有15000台主机。我有名单。如果主机名匹配,则函数应返回true。所以我用了很多||

'https?:\/\/([a-z0-9]+[.])*td.com'
我使用的是正则表达式“https?://[a-z0-9]+[.]*td.com” 剧本似乎很慢。这是有效的方法吗? 注意:我想连接15000个URL,这样只有1个匹配;但是有人可能会提出f-n-b.com.UnWantedWebSite.fake,它可以与上面列表中的第一个f-n-b.com匹配。正当
寻找简单的javascript。我无法使用jQuery或其他LIB。

使用document.domain后缀安全限制在当前页面上查找域。 如果您只需要在主机列表中查找域:

变量域==>{ 设d=location.hostname.split'',dd=document.domain 设i=0 试一试{ whiledocument.domain=d.slice++i.join'; }捕获e{} 试一试{ document.domain=dd//还原document.domain }catch{} return!i?document.domain:d.slicei-1.join'' }.toLowerCase console.loghostlist.IncludeDomain+'\n'| | hostlist.endsWith'\n'+域 如果您需要在子域上匹配,但在根域上不匹配,例如,如果www.google.com在主机列表中但不在google.com中,则google.com将为false,而www.google.com将为true:

var domains = (()=>{
  let d = location.hostname.split('.'), dd = document.domain,
      res = [location.hostname]
  let i = 0
  try {
    while(document.domain = d.slice(++i).join('.'))
      res.push(document.domain)
  } catch (e) {}
  try{
    document.domain = dd // restore document.domain
  } catch (e) {}
  return res
})()
var re = new RegExp(domains
   .map(d =>'^' + d.replace(/\./g,'\\.').toLowerCase() + '$')
   .join('|'), 'm')
console.log(re, re.test(hostlist))
例如:sub1.sub2.sub3.domain.com将生成RegExp: ^sub1.sub2.sub3.domain.com$^domain.com$^sub3.domain.com$^sub2.sub3.domain.com$

不确定是否理解。。。你有主机名列表,为什么这里有正则表达式?您不能只查找列表以查看值是否在其中吗?您可以使用includes方法而不是使用正则表达式。是吗?是数据库、数组还是对象中的15000个名称?@kaido我有主机名,但window.location.hostname可以给我很多子域,比如credit.shooper.vending.abc.business,而我的列表中只有abc.business。@Gerard它们是硬编码的。所以我对任何形式都持开放态度,我对mvp很灵活。当然不在数据库中。代码运行得非常好。它不起作用,例如,shopping.bbc.co.il的xx.yy型TLD,但我认为问题在于我对JS的了解有限。对不起,我不知道我到底怎么了。这里滑得很厉害。现在肯定修好了。我把两者都调整好了。我的域检查代码做了一些愚蠢的事情。作为参考,此域检测对任意URL字符串无效,仅对浏览器所在的当前页面有效。为了从任意URL中提取域,您需要使用域后缀DB,其中有预构建的js文件来获取域。这是一个较短的黑客攻击,它测试document.domain安全性,以使用浏览器的内置域检测代码验证域。