Domanda

Serve una funzione come:

function isGoogleURL(url) { ... }

che restituisce l'URL iff vero appartiene a Google. Nessun falso positivo; nessun falso negativo.

Fortunatamente c'è questo come riferimento:

  

.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

Qualche idea su come farlo elegantemente?

Alcuni chiarimenti:

  • Ho bisogno di questo per uno script greasemonkey che ho scritto che attualmente funziona solo per google.com (e dovrebbe funzionare anche per tutti gli altri TLD). Qui è lo script (modifica Google Reader per funzionare meglio su schermi ampi).
  • Dovrebbe funzionare su URL che appartengono ai domini precedenti (non blogger.com, ecc.).
È stato utile?

Soluzione

Ecco una versione aggiornata della risposta di Prestaul che risolve i due problemi che ho menzionato nel commento lì.

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

Altri suggerimenti

Tutti i domini terminano in " google.xx " ;, " google.co.xx " ;, oppure " google.com.xx " eccetto " google.it.ao " e " google.com " ;, quindi se guardi solo il dominio, questa espressione regolare dovrebbe funzionare nella maggior parte dei casi (non è perfetta, ma accetta tutti i domini elencati e rifiuta la maggior parte degli altri domini validi che includono " Google "):

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

Come funzione potresti fare qualcosa del genere:

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

Potresti semplificarlo se usi window.location.hostname :

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

L'unico modo in cui ciò dovrebbe consentire un falso positivo è se esiste un "google. (qualche altro TLD)". Ad esempio, " google.tv " ;, non è nell'elenco (reindirizza a google.com), ma passerebbe.

Modifica: Come sottolineato da Wimmel, accetta anche domini non validi come " google.com.fr " che non sono elencati. Accetterà sostanzialmente qualsiasi "quotazione" di Google. nome di dominio.

Conti altre proprietà di Google come " appartenenti a Google " ;? FeedBurner, Blogger ecc.

Posso chiederti qual è lo scopo di questo? Potrebbe esserci un modo migliore di fare quello che vuoi ... e se è ragionevole, posso chiederti internamente.

Se non hai bisogno che il test sia accurato al 100%, questa semplice regex farebbe per tutti i domini che hai pubblicato sopra:

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

Sto solo testando la presenza di " .google. " sarebbe sufficiente nella maggior parte dei casi, anche se potrebbe essere facilmente ingannato aggiungendo un "google" dominio nell'URL (non così facile, né fatto rapidamente).

O semplicemente aspetta che Google acquisti il ??proprio TLD di Google.

Sono d'accordo che probabilmente non dovresti farlo ... Tuttavia, se hai intenzione di farlo (e non sei soddisfatto delle soluzioni precedentemente offerte che controllano solo un modello simile a Google), allora questo è come lo approccerei:

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

Questo crea una regex basata sul dominio dell'URL e lo utilizza per testare l'elenco dei domini.

Nota: la variabile GOOGLE_DOMAINS è solo una stringa che contiene i contenuti restituiti dall'URL che hai pubblicato. Non è possibile recuperare quella stringa tramite AJAX o iframe perché non è possibile effettuare tale richiesta tra domini. Dovrai codificarlo o effettuare una richiesta sul lato server per recuperare tale elenco.

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

Questo crea una regex basata sul dominio dell'URL e lo utilizza per testare l'elenco dei domini.

Nota: la variabile GOOGLE_DOMAINS è solo una stringa che contiene i contenuti restituiti dall'URL che hai pubblicato. Non è possibile recuperare quella stringa tramite AJAX o iframe perché non è possibile effettuare tale richiesta tra domini. Dovrai codificarlo o effettuare una richiesta sul lato server per recuperare tale elenco.

Un'espressione regolare può essere ciò di cui hai bisogno. Un esempio è:

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

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

Ciò otterrebbe il contenuto di un elemento span "a" e lo cambierebbe in "vero". se google.com e " false " altrimenti. Tieni presente che non considera tutti gli altri URL (sebbene il regex possa essere facilmente modificato per farlo), e "quot.google.com", ad esempio, non corrisponderebbe.

Inoltre, tutti i tuoi URL hanno un ". " prima di loro (" .google.com " invece di " google.com "). Questo ha qualche motivo o è solo un errore?

Potresti usare un'espressione regolare come ....

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

e immagino che generarlo in JavaScript (o in qualsiasi lingua tu scelga) da un array o da qualche altro set di dati sarebbe relativamente facile.

Non farei questo lato client.

L'elenco dei domini Google non cambia così frequentemente, quindi è possibile memorizzare un elenco sul lato server e quindi generare dinamicamente i file .js per verificarlo.

Senza una regex per abbinare individualmente ogni TLD, non esiste davvero un "modo elegante di farlo".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top