Estoy creando una extensión de Chrome a la que se le proporciona una lista de dominios que deben compararse con la URL activa de una pestaña. Por ejemplo, si la lista de dominios tiene "google", la extensión debería detectar "docs.google.com" como parte de la lista de dominios. He conseguido que esta parte funcione. El problema es cuando la lista de dominios contiene un subdominio. Por ejemplo: si "docs.google" está en la lista, si el usuario está en "google.com", la extensión no debería reconocerlo como una URL en la lista de dominios.
Estoy intentando esto construyendo una expresión regular. para cada dominio y subdominio. Como dije, cuando te dan un dominio (a diferencia de un subdominio) funciona correctamente, aunque lo he probado con subdominios y parece que no funciona. Supongo que el problema es cómo construí el RegEx. ¿Algo que destaque? ¡gracias de antemano!
let onDomainList = false; for(let i = 0; i < domainListLength-1; i++){ if(!domainList[i].includes(".")){ //if this domain is not a subdomain let strPattern = "^https://www\\." + list.domainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "|https://[a-z_]+\\." + list.domainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); let domainRegEx = new RegExp(strPattern,'i'); if(domainRegEx.test(activeTab.url)){ onDomainList = true; execute_script(activeTab); } } else{ //if this domain is a subdomain let strPattern = "^https://www\\." + list.domainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); let domainRegEx = new RegExp(strPattern,'i'); if(domainRegEx.test(activeTab.url)){ onDomainList = true; execute_script(activeTab); } } }EDITAR: Cambió RegEx a lo que sugirió Wiktor Stribizew, aunque sigue siendo el problema de no detectar subdominios.
Aquí hay un fragmento fijo:
let onDomainList = false; for (let i = 0; i < domainListLength - 1; i++) { if (!domainList[i].includes(".")) { //if this domain is not a subdomain let strPattern = let strPattern = "^https://www\\." + domainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "|https://[a-z_]+\\." + domainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); let domainRegEx = new RegExp(strPattern, 'i'); if (domainRegEx.test(activeTab.url)) { onDomainList = true; execute_script(activeTab); } } else { //if this domain is a subdomain let strPattern = "^https://(?:[^\\s/]*\\.)?" + list.domainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); let domainRegEx = new RegExp(strPattern, 'i'); if (domainRegEx.test(activeTab.url)) { onDomainList = true; execute_script(activeTab); } } }Notas :
RegExp y define la expresión regular con un literal de cadena regular, debe introducir correctamente las barras diagonales inversas utilizadas para escapar de los caracteres especiales. Aquí, no hay necesidad de escapar / y el . necesita dos barras invertidas, "\\." cadena literal es en realidad un \. textodomainList[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')/ antes de ^ hace que la expresión regular sea inútil ya que no puede haber / antes del comienzo de la cadena y, por lo tanto, /^ es una expresión regular que nunca coincide con ninguna cadena. / como delimitadores de expresiones regulares no deben usarse en la notación del constructor RegExphttps://www. + el dominio de tu lista. Para permitir cualquier cosa antes del dominio, puede reemplazar www\. con (?:[^\s/]*\.)? que coincida con una secuencia opcional ( (?:...)? es un grupo opcional que no captura) de cero o más caracteres que no sean espacios en blanco y / (con la clase de caracteres [^\/s]* negada) y luego un punto .