Frage

Sie benötigen eine Funktion wie:

function isGoogleURL(url) { ... }

, die true zurückgibt iff URL zu Google gehört. Keine Fehlalarme; keine falsch-negative Ergebnisse.

Glücklicherweise gibt es diese als Referenz:

  

.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

Alle Ideen, wie dies elegant tun?

einige Klärungen:

  • Ich brauche dies für ein Greasemonkey-Skript ich, dass derzeit nur für google.com arbeitet schrieb (und sollte auch für alle anderen TLDs arbeiten). Hier ist das Skript (es ändert Google Reader besser auf großen Bildschirmen zu arbeiten).
  • Es sollte auf URLs arbeiten, die zu den oben genannten Domänen gehören (nicht blogger.com, usw.).
War es hilfreich?

Lösung

Hier ist eine aktualisierte Version von Prestaul Antwort, die die beiden Probleme löst ich es im Kommentar erwähnt.

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

Andere Tipps

Alle Domains enden entweder im „google.xx“, „google.co.xx“ oder „google.com.xx“ außer „google.it.ao“ und „google.com“, wenn Sie also nur Blick auf die Domäne dieser reguläre Ausdruck sollte in den meisten Fällen arbeiten (es ist nicht perfekt, aber es nimmt alle aufgeführten Domänen und verwirft die meisten anderen gültigen Domains, die gehören „google“ passieren):

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

Als Funktion, die Sie so etwas tun könnte:

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

Sie könnten es vereinfachen, wenn Sie window.location.hostname verwenden:

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

Der einzige Weg, dies eine falsche positive erlauben sollte, ist, wenn es eine „Google. (Einige andere TLD)“. Zum Beispiel: „google.tv“, ist nicht auf der Liste (es Umleitungen an google.com), aber es würde passieren.

Edit: Wie Wimmel darauf hingewiesen, es nimmt auch ungültige Domains wie "google.com.fr", die nicht aufgeführt sind. Es wird grundsätzlich jede "google.whatever" Domain-Namen akzeptieren.

Zählen Sie andere Google-Eigenschaften als „zu Google gehörenden“? Feedburner, Blogger etc.?

Darf ich fragen, was der Zweck ist das? Es kann ein besserer Weg sein zu tun, was Sie wollen ... und wenn es sinnvoll ist, kann ich intern frage für Sie.

Wenn Sie den Test nicht benötigen 100% genau zu sein, diese einfache Regex für alle Domains würden Sie oben geschrieben:

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

Testen Sie einfach die Anwesenheit von „.google.“ ausreichen würde in den meisten Fällen, obwohl sie leicht durch das Hinzufügen einer „google“ Domain in der URL (nicht so einfach, aber noch schnell erledigt).

täuschen könnten

oder einfach warten, für Google ein eigenes Google-TLD zu kaufen.

Ich bin damit einverstanden, dass Sie wahrscheinlich nicht das tun ... Aber wenn Sie es tun werden (und Sie sind nicht zufrieden mit den bisher angebotenen Lösungen, die nur für ein Google-ähnlichen Muster überprüfen), dann ist dies wie ich es Ansatz:

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, '\\.') + '$', 'mi');
    return re.test(GOOGLE_DOMAINS);
}

Dies erzeugt eine regex basiert auf dem Domain Ihre URL und verwendet sie, um die Liste der Domänen zu testen.

Hinweis: Die GOOGLE_DOMAINS Variable ist nur eine Zeichenfolge, die den Inhalt aus der URL Sie auf dem Laufenden zurückhält. Es gibt keine Möglichkeit für Sie diese Zeichenfolge über AJAX oder iframe abrufen, weil Sie nicht eine solche Anfrage über mehrere Domains machen. Sie finden es zu hart Code haben oder eine Anfrage serverseitige machen, um diese Liste abgerufen werden.

Ein regulärer Ausdruck kann sein, was Sie brauchen. Ein Beispiel ist:

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

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

Dies würde den Inhalt eines span-Element „a“ erhalten, und es wäre „true“, wenn google.com zu ändern, und „false“ sonst. Beachten Sie, dass es nicht alle anderen URLs nicht berücksichtigt (obwohl die regex leicht modifiziert werden könnte, dies zu tun), und „pages.google.com“ zum Beispiel würde nicht überein.

Auch Ihre URLs haben alle ein „“ vor ihnen ( "google.com" anstelle von "google.com"). Ist dies aus irgendeinem Grund hat oder ist es nur ein Fehler?

Sie können einen regulären Ausdruck verwenden, wie ....

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

und ich kann mir vorstellen, dass in JavaScript zu erzeugen (oder was auch immer Sprache, die Sie wählen) aus einem Array oder einem anderen Datensatz wäre relativ einfach.

Ich würde diesen clientseitige nicht tun.

Die Liste der Google-Domains nicht so häufig ändern, so dass Sie eine Liste serverseitige speichern könnten und dann generieren dynamisch die Js es zu überprüfen.

Ohne eine regex individuell auf jeden einzelnen TLD zu entsprechen, gibt es nicht wirklich eine ‚elegante Art und Weise, es zu tun.‘

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top