Question

Besoin d'une fonction comme:

function isGoogleURL(url) { ... }

qui renvoie la valeur true si l'URL appartient à Google. Pas de faux positifs; pas de faux négatifs.

Heureusement, il y a this comme référence:

  

.google.com .google.ad .google.ae .google.com.af .google.com.ag .google.com.ai .google.am .google.it. 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.fr .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

Des idées sur la manière de faire cela avec élégance?

Quelques clarifications:

  • J'ai besoin de cela pour un script greasemonkey que j'ai écrit et qui ne fonctionne actuellement que pour google.com (et devrait également fonctionner pour tous les autres TLD). Voici le script (il permet à Google Reader de fonctionner plus facilement sur les grands écrans).
  • Cela devrait fonctionner sur les URL appartenant aux domaines ci-dessus (pas blogger.com, etc.).
Était-ce utile?

La solution

Voici une version mise à jour de la réponse de Prestaul qui résout les deux problèmes que j'ai mentionnés dans le commentaire.

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

Autres conseils

Tous les domaines se terminent par "google.xx", "google.co.xx" ou "google.com.xx". sauf "google.it.ao". et "google.com", donc si vous ne regardez que le domaine, cette expression régulière devrait fonctionner dans la plupart des cas (ce n'est pas parfait, mais elle accepte tous les domaines répertoriés et rejette la plupart des autres domaines valides contenant notamment " google "):

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

En tant que fonction, vous pouvez faire quelque chose comme ceci:

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);
}

Vous pouvez le simplifier si vous utilisez window.location.hostname :

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

La seule façon de permettre un faux positif est de créer un "google. (un autre TLD)". Par exemple, "google.tv" ne figure pas dans la liste (il redirige vers google.com), mais cela passerait.

Modifier: Comme l'a souligné Wimmel, il accepte également les domaines non valides tels que & google.com.fr " qui ne sont pas listés. En gros, il acceptera tous les " google.whats " nom de domaine.

Estimez-vous que les autres propriétés de Google appartiennent à Google " FeedBurner, Blogger, etc.?

Puis-je demander quel est le but de ceci? Il y a peut-être une meilleure façon de faire ce que vous voulez ... et si c'est raisonnable, je peux demander à l'interne pour vous.

Si vous n'avez pas besoin que le test soit précis à 100%, cette regex simple conviendra à tous les domaines que vous avez publiés ci-dessus:

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

Test de la présence de " .google. " suffirait dans la plupart des cas, même s’il pouvait facilement être trompé en ajoutant un " google " domaine dans l'url (pas si facile cependant, ni rapidement fait).

Ou attendez simplement que Google achète son propre domaine Google.

Je conviens que vous ne devriez probablement pas faire cela ... Cependant, si vous comptez le faire (et que vous ne vous contentez pas des solutions proposées précédemment qui ne font que rechercher un modèle semblable à celui de Google), alors ceci est: comment je l'aborderais:

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, '\\.') + '

Ceci crée une expression rationnelle basée sur le domaine de votre URL et l'utilise pour tester la liste des domaines.

Remarque: la variable GOOGLE_DOMAINS est simplement une chaîne contenant le contenu renvoyé par l'URL que vous avez publiée. Vous n'avez aucun moyen de récupérer cette chaîne via AJAX ou iframe car vous ne pouvez pas faire une telle demande sur plusieurs domaines. Vous devrez le coder en dur ou faire une requête côté serveur pour récupérer cette liste.

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

Ceci crée une expression rationnelle basée sur le domaine de votre URL et l'utilise pour tester la liste des domaines.

Remarque: la variable GOOGLE_DOMAINS est simplement une chaîne contenant le contenu renvoyé par l'URL que vous avez publiée. Vous n'avez aucun moyen de récupérer cette chaîne via AJAX ou iframe car vous ne pouvez pas faire une telle demande sur plusieurs domaines. Vous devrez le coder en dur ou faire une requête côté serveur pour récupérer cette liste.

Une expression régulière peut être ce dont vous avez besoin. Un exemple est:

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

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

Ceci obtiendrait le contenu d'un élément de plage "a" et le changerait en "vrai". si google.com et " false " autrement. Notez que toutes les autres URL ne sont pas prises en compte (bien que les expressions rationnelles puissent facilement être modifiées), et "pages.google.com", par exemple, ne correspond pas.

De plus, vos URL ont toutes un ". " devant eux (".google.com" au lieu de "google.com"). Est-ce que cela a une raison ou est-ce juste une erreur?

Vous pouvez utiliser une expression régulière telle que ....

^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)

et j'imagine que générer cela en JavaScript (ou quelle que soit la langue choisie) à partir d'un tableau ou d'un autre ensemble de données serait relativement facile.

Je ne ferais pas ce côté client.

La liste des domaines Google ne change pas si souvent. Vous pouvez donc stocker une liste côté serveur, puis générer dynamiquement le fichier .j pour le vérifier.

Sans regex qui correspond individuellement à chaque TLD, il n’ya pas vraiment de "façon élégante de le faire".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top