Pregunta

Necesita una función como:

function isGoogleURL(url) { ... }

que devuelve verdadero si la URL pertenece a Google. No hay falsos positivos; sin falsos negativos.

Por suerte, hay esto como referencia:

  

.google.com .google.ad .google.ae .google.com.af .google.com.ag .google.com.ai .google.am .google.it.ao .google.com.ar. google.as .google.at .google.com.au .google.az .google.ba .google.com.bd .google.be .google.bg .google.com.bh .google.bi .google.com. bn .google.com.bo .google.com.br .google.bs .google.co.bw .google.com.by .google.com.bz .google.ca .google.cd .google.cg .google. ch .google.ci .google.co.ck .google.cl .google.cn .google.com.co .google.co.cr .google.com.cu .google.cz .google.de .google.dj. google.dk .google.dm .google.com.do .google.dz .google.com.ec .google.ee .google.com.eg .google.es .google.com.et .google.fi .google. com.fj .google.fm .google.fr .google.ge .google.gg .google.com.gh .google.com.gi .google.gl .google.gm .google.gp .google.gr .google. com.gt .google.gy .google.com.hk .google.hn .google.hr .google.ht .google.hu .google.co.id .google.ie .google.co.il .google.im. google.co.in .google.is .google.it .google.je .google.com.jm .google.jo .google.co.jp .google .co.ke .google.com.kh .google.ki .google.kg .google.co.kr .google.kz .google.la .google.li .google.lk .google.co.ls .google.lt .google.lu .google.lv .google.com.ly .google.co.ma .google.md .google.mn .google.ms .google.com.mt .google.mu .google.mv .google.mw .google.com.mx .google.com.my .google.co.mz .google.com.na .google.com.nf .google.com.ng .google.com.ni .google.nl .google.no .google.com.np .google.nr .google.nu .google.co.nz .google.com.om .google.com.pa .google.com.pe .google.com.ph .google.com.pk .google.pl .google.pn .google.com.pr .google.pt .google.com.py .google.com.qa .google.ro .google.ru .google.rw .google.com.sa .google .com.sb .google.sc .google.se .google.com.sg .google.sh .google.si .google.sk .google.sn .google.sm .google.st .google.com.sv .google .co.th .google.com.tj .google.tk .google.tl .google.tm .google.to .google.com.tr .google.tt .google.com.tw .google.co.tz .google .com.ua .google.co.ug .google.co.uk .google.com.uy .google.co.uz .google.com.vc .google.co.ve. google.vg .google.co.vi .google.com.vn .google.vu .google.ws .google.rs .google.co.za .google.co.zm .google.co.zw .google.cat

¿Alguna idea de cómo hacer esto con elegancia?

Algunas aclaraciones:

  • Necesito esto para un script de greasemonkey que escribí que actualmente solo funciona para google.com (y debería funcionar también para todos los demás TLD). Aquí es el script (modifica Google Reader para que funcione mejor en pantallas anchas).
  • Debería funcionar en las URL que pertenecen a los dominios anteriores (no blogger.com, etc.).
¿Fue útil?

Solución

Aquí hay una versión actualizada de la respuesta de Prestaul que resuelve los dos problemas que mencioné en el comentario allí.

var GOOGLE_DOMAINS = ([
    '.google.com',
    '.google.ad',
    '.google.ae',
    '.google.com.af',
    '.google.com.ag',
    '.google.com.ai',
    '.google.am',
    '.google.it.ao',
    '.google.com.ar',
    '.google.as',
    '.google.at',
    '.google.com.au',
    '.google.az',
    '.google.ba',
    '.google.com.bd'
]).join('\n');

function isGoogleUrl(url) {
    // get the 2nd level domain from the url
    var domain = /^https?:\/\/[^\///]*(google\.[^\/\\]+)\//i.exec(url);
    if(!domain) return false;

    domain = '.'+domain[1];
    // create a regex to check to see if the domain is supported
    var re = new RegExp('^' + domain.replace(/\./g, '\\.') + ', 'mi');
    return re.test(GOOGLE_DOMAINS);
}

alert(isGoogleUrl('http://www.google.ba/the/page.html')); // true
alert(isGoogleUrl('http://some_mal_site.com/http://www.google.ba/')); // false
alert(isGoogleUrl('https://google.com.au/')); // true
alert(isGoogleUrl('http://www.google.com.some_mal_site.com/')); // false
alert(isGoogleUrl('http://yahoo.com/')); // false

Otros consejos

Todos los dominios terminan en " google.xx " ;, " google.co.xx " ;, o " google.com.xx " excepto " google.it.ao " y "google.com", por lo que si solo mira el dominio, esta expresión regular debería funcionar para la mayoría de los casos (no es perfecta, pero acepta todos los dominios enumerados y rechaza la mayoría de los otros dominios válidos que incluyen " google "):

/^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i

Como función, podría hacer algo como esto:

function isGoogleUrl(url) {
    url = url.replace(/^https?:\/\//i, ''); // Strip "http://" from the beginning
    url = url.replace(/\/.*/, ''); // Strip off the path
    return /^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i.test(url);
}

Podría simplificarlo si usa window.location.hostname :

function isGoogleUrl() {
    return /^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i.test(window.location.hostname);
}

La única forma en que esto debería permitir un falso positivo es si hay un "google" (algún otro TLD). Por ejemplo, " google.tv " ;, no está en la lista (redirige a google.com), pero pasaría.

Editar: Como señaló Wimmel, también acepta dominios no válidos como " google.com.fr " que no están en la lista Básicamente aceptará cualquier "google.whatever" nombre de dominio.

¿Cuenta otras propiedades de Google como " pertenecientes a Google " ;? ¿FeedBurner, Blogger, etc.?

¿Puedo preguntar cuál es el propósito de esto? Puede haber una mejor manera de hacer lo que quiere ... y si es razonable, puedo preguntar internamente por usted.

Si no necesita que la prueba sea 100% precisa, esta simple expresión regular funcionaría para todos los dominios que publicó anteriormente:

"(http://)?([\w]+)?\.google\.([\w]{2,3})"

Simplemente probando la presencia de " .google. " sería suficiente en la mayoría de los casos, aunque podría ser fácilmente engañado agregando un " google " dominio en la url (aunque no es tan fácil, ni se hace rápidamente).

O simplemente espere a que Google compre su propio TLD de Google.

Estoy de acuerdo en que probablemente no deberías hacer esto ... Sin embargo, si vas a hacerlo (y no estás contento con las soluciones ofrecidas anteriormente que solo comprueban un patrón similar a Google), entonces esto es cómo lo abordaría:

var GOOGLE_DOMAINS = ([
    '.google.com',
    '.google.ad',
    '.google.ae',
    '.google.com.af',
    '.google.com.ag',
    '.google.com.ai',
    '.google.am',
    '.google.it.ao',
    '.google.com.ar',
    '.google.as',
    '.google.at',
    '.google.com.au',
    '.google.az',
    '.google.ba',
    '.google.com.bd'
]).join('\n');

function isGoogleUrl(url) {
    var url = 'http://www.google.ba/the/page.html';

    // get the domain from the url
    var domain = /\.google\.[^\/\\]+/i.exec(url) + '';
    if(!domain) return false;

    // create a regex to check to see if the domain is supported
    var re = new RegExp('^' + domain.replace(/\./g, '\\.') + '

Esto crea una expresión regular basada en el dominio de su URL y la usa para probar la lista de dominios.

Nota: La variable GOOGLE_DOMAINS es solo una cadena que contiene el contenido devuelto por la URL que publicó. No hay forma de recuperar esa cadena a través de AJAX o iframe porque no puede realizar dicha solicitud en todos los dominios. Tendrá que codificarlo o realizar una solicitud en el servidor para recuperar esa lista.

, 'mi'); return re.test(GOOGLE_DOMAINS); }

Esto crea una expresión regular basada en el dominio de su URL y la usa para probar la lista de dominios.

Nota: La variable GOOGLE_DOMAINS es solo una cadena que contiene el contenido devuelto por la URL que publicó. No hay forma de recuperar esa cadena a través de AJAX o iframe porque no puede realizar dicha solicitud en todos los dominios. Tendrá que codificarlo o realizar una solicitud en el servidor para recuperar esa lista.

Una expresión regular puede ser lo que necesita. Un ejemplo es:

<script>
var elem = document.getElementById("a");
var regex = new RegExp("(http://)?(www\\.)?google\\.com");

elem.innerHTML = regex.test(elem.innerHTML);
</script>

Esto obtendría el contenido de un elemento span '' a '' y lo cambiaría a '' verdadero '' si google.com, y "falso" de otra manera. Tenga en cuenta que no tiene en cuenta todas las demás URL (aunque la expresión regular podría modificarse fácilmente para hacerlo), y '' pages.google.com '', por ejemplo, no coincidirían.

Además, todas sus URL tienen un ". " delante de ellos (" .google.com " en lugar de " google.com "). ¿Tiene esto alguna razón o es solo un error?

Podría usar una expresión regular como ...

^https?://[-A-Za-z0-9\.]+(\.google\.com|\.google\.ad|\.google\.ae|\.google\.com\.af|\.google\.com\.ag|\.google\.com\.ai|\.google\.am|\.google\.it\.ao|\.google\.com\.ar|\.google\.as|\.google\.at|\.google\.com\.au|\.google\.az|\.google\.ba|\.google\.com\.bd|\.google\.be|\.google\.bg|\.google\.com\.bh|\.google\.bi|\.google\.com\.bn|\.google\.com\.bo|\.google\.com\.br|\.google\.bs|\.google\.co\.bw|\.google\.com\.by|\.google\.com\.bz|\.google\.ca|\.google\.cd|\.google\.cg|\.google\.ch|\.google\.ci|\.google\.co\.ck|\.google\.cl|\.google\.cn|\.google\.com\.co|\.google\.co\.cr|\.google\.com\.cu|\.google\.cz|\.google\.de|\.google\.dj|\.google\.dk|\.google\.dm|\.google\.com\.do|\.google\.dz|\.google\.com\.ec|\.google\.ee|\.google\.com\.eg|\.google\.es|\.google\.com\.et|\.google\.fi|\.google\.com\.fj|\.google\.fm|\.google\.fr|\.google\.ge|\.google\.gg|\.google\.com\.gh|\.google\.com\.gi|\.google\.gl|\.google\.gm|\.google\.gp|\.google\.gr|\.google\.com\.gt|\.google\.gy|\.google\.com\.hk|\.google\.hn|\.google\.hr|\.google\.ht|\.google\.hu|\.google\.co\.id|\.google\.ie|\.google\.co\.il|\.google\.im|\.google\.co\.in|\.google\.is|\.google\.it|\.google\.je|\.google\.com\.jm|\.google\.jo|\.google\.co\.jp|\.google\.co\.ke|\.google\.com\.kh|\.google\.ki|\.google\.kg|\.google\.co\.kr|\.google\.kz|\.google\.la|\.google\.li|\.google\.lk|\.google\.co\.ls|\.google\.lt|\.google\.lu|\.google\.lv|\.google\.com\.ly|\.google\.co\.ma|\.google\.md|\.google\.mn|\.google\.ms|\.google\.com\.mt|\.google\.mu|\.google\.mv|\.google\.mw|\.google\.com\.mx|\.google\.com\.my|\.google\.co\.mz|\.google\.com\.na|\.google\.com\.nf|\.google\.com\.ng|\.google\.com\.ni|\.google\.nl|\.google\.no|\.google\.com\.np|\.google\.nr|\.google\.nu|\.google\.co\.nz|\.google\.com\.om|\.google\.com\.pa|\.google\.com\.pe|\.google\.com\.ph|\.google\.com\.pk|\.google\.pl|\.google\.pn|\.google\.com\.pr|\.google\.pt|\.google\.com\.py|\.google\.com\.qa|\.google\.ro|\.google\.ru|\.google\.rw|\.google\.com\.sa|\.google\.com\.sb|\.google\.sc|\.google\.se|\.google\.com\.sg|\.google\.sh|\.google\.si|\.google\.sk|\.google\.sn|\.google\.sm|\.google\.st|\.google\.com\.sv|\.google\.co\.th|\.google\.com\.tj|\.google\.tk|\.google\.tl|\.google\.tm|\.google\.to|\.google\.com\.tr|\.google\.tt|\.google\.com\.tw|\.google\.co\.tz|\.google\.com\.ua|\.google\.co\.ug|\.google\.co\.uk|\.google\.com\.uy|\.google\.co\.uz|\.google\.com\.vc|\.google\.co\.ve|\.google\.vg|\.google\.co\.vi|\.google\.com\.vn|\.google\.vu|\.google\.ws|\.google\.rs|\.google\.co\.za|\.google\.co\.zm|\.google\.co\.zw|\.google\.cat)

y me imagino que generar eso en JavaScript (o cualquier idioma que elija) desde una matriz o algún otro conjunto de datos sería relativamente fácil.

No haría esto del lado del cliente.

La lista de dominios de Google no cambia con tanta frecuencia, por lo que puede almacenar una lista del lado del servidor y luego generar dinámicamente el .js para verificarlo.

Sin una expresión regular que coincida individualmente con todos y cada uno de los TLD, no existe realmente una "forma elegante de hacerlo".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top