Это наиболее эффективный способ сопоставления с 15 000 имен хостов URL в javascript - PullRequest
0 голосов
/ 18 июня 2020

Я использую window.location.hostname для получения имени хоста. Я хочу сравнить имя хоста с известными именами хостов из списка, например fnb.com, td.com, shopping.ab c .business, key.com, google.com (полностью похоже на 15000 хосты. У меня есть список ). Если есть совпадение имени хоста, функция должна вернуть true. Итак, я использую много ||

'https?:\/\/([a-z0-9]+[.])*td.com'

. Я использую регулярное выражение https?: // ([a-z0-9] + [.]) * Td.com »Кажется, что сценарий быть медленным. Это эффективный подход? Примечание : я подумал о конкатенации 15000 URL-адресов, чтобы было только одно совпадение; но кто-то мог придумать fnb.com.UnWantedWebSite.fake , который мог бы соответствовать первому fnb.com в приведенном выше списке. Правильно(??). Ищу равнину javascript. Я не могу использовать jQuery или другие библиотеки.

1 Ответ

1 голос
/ 19 июня 2020

Использует ограничение безопасности суффикса document.domain для поиска домена на текущей странице.
Если вам нужно только искать домен в вашем списке хостов:

var domain = (()=>{
  let d = location.hostname.split('.'), dd = document.domain
  let i = 0
  try {
    while(document.domain = d.slice(++i).join('.'));
  } catch (e) {}
  try{
  document.domain = dd // restore document.domain
  } catch(e){}
  return !i ? document.domain : d.slice(i-1).join('.')
})().toLowerCase()
console.log(hostlist.includes(domain+'\n') || hostlist.endsWith('\n'+domain))

Если вам нужно сопоставить поддомены, но не совпадение на доменах root (например, google.com будет ложным, но www.google.com будет истинным, если www.google.com находится в списке хостов, но не google.com):

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$
RegEx Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...