Функция JavaScript для соответствия только Google URL - PullRequest
2 голосов
/ 03 ноября 2008

Нужна функция вроде:

function isGoogleURL(url) { ... }

, который возвращает истину, если URL принадлежит Google. Нет ложных срабатываний; без ложных негативов.

К счастью, есть это в качестве ссылки:

.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 .goo gle.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. нет .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.v e .google.vg .google.co.vi .google.com.vn .google.vu .google.ws .google.rs .google.co.za .google.co.zm .google.co.zw .google. кошка

Есть идеи, как сделать это элегантно?

Некоторые пояснения:

  • Мне это нужно для сценария greasemonkey, который я написал, который в настоящее время работает только для google.com (и должен работать также для всех других TLD). Здесь - скрипт (он модифицирует Google Reader для лучшей работы на широких экранах).
  • Он должен работать с URL-адресами, принадлежащими вышеуказанным доменам (не blogger.com и т. Д.).

Ответы [ 9 ]

6 голосов
/ 16 ноября 2008

Вот обновленная версия ответа Prestaul, которая решает две проблемы, которые я упомянул в комментарии там.

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
2 голосов
/ 16 ноября 2008

Все домены оканчиваются на "google.xx", "google.co.xx" или "google.com.xx", кроме "google.it.ao" и "google.com", поэтому если вы просто Посмотрите на домен, это регулярное выражение должно работать в большинстве случаев (оно не идеально, но оно принимает все перечисленные домены и отклоняет большинство других допустимых доменов, в которых есть "google"):

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

В качестве функции вы можете сделать что-то вроде этого:

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

Вы можете упростить это, если используете window.location.hostname:

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

Единственный способ допустить ложный положительный результат - это если есть "google. (Некоторый другой TLD)". Например, "google.tv" нет в списке (он перенаправляет на google.com), но он прошел бы.

Редактировать: Как указал Виммель, он также принимает недействительные домены, такие как "google.com.fr", которые не указаны в списке. Он в основном будет принимать любое доменное имя "google.wh независимо".

1 голос
/ 03 ноября 2008

Если вам не нужен тест, чтобы быть точным на 100%, это простое регулярное выражение подойдет для всех доменов, которые вы разместили выше:

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

Просто проверяю наличие ".google". в большинстве случаев будет достаточно, хотя его легко можно обмануть, добавив в URL домен «google» (хотя это не так просто и быстро).

Или просто подождите, пока Google купит собственный TLD Google.

1 голос
/ 03 ноября 2008

Я согласен, что вы, вероятно, не должны этого делать ... Однако, если вы собираетесь это сделать (и вы не довольны ранее предложенными решениями, которые просто проверяют Google-подобный шаблон), то это как бы я подошел к этому:

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

Это создает регулярное выражение на основе домена вашего URL и использует его для проверки списка доменов.

Примечание. Переменная GOOGLE_DOMAINS - это просто строка, содержащая содержимое, возвращаемое из размещенного вами URL-адреса. Вы не можете получить эту строку через AJAX или iframe, потому что вы не можете сделать такой запрос для разных доменов. Вам придется жестко закодировать его или сделать запрос на стороне сервера, чтобы получить этот список.

1 голос
/ 03 ноября 2008

Считаете ли вы другие свойства Google "принадлежащими Google"? FeedBurner, Blogger и т. Д.

Могу я спросить, какова цель этого? Может быть, есть лучший способ сделать то, что вы хотите ... и если это разумно, я могу попросить вас внутренне.

0 голосов
/ 03 ноября 2008

Вы можете использовать регулярное выражение как ....

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

и я бы подумал, что сгенерировать это в JavaScript (или на любом другом языке, который вы выберете) из массива или другого набора данных было бы относительно просто.

0 голосов
/ 03 ноября 2008

Регулярное выражение может быть тем, что вам нужно. Пример:

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

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

Это получит содержимое элемента span "a" и изменит его на "true", если google.com, и "false" в противном случае. Обратите внимание, что он не учитывает все другие URL-адреса (хотя регулярное выражение можно легко изменить для этого), и, например, "pages.google.com" не будет соответствовать.

Кроме того, все ваши URL имеют "." перед ними (". google.com" вместо "google.com"). Это имеет какую-то причину или это просто ошибка?

0 голосов
/ 03 ноября 2008

Без регулярного выражения для индивидуального сопоставления каждого ДВУ, на самом деле не существует «элегантного способа сделать это».

0 голосов
/ 03 ноября 2008

Я бы не стал делать это на стороне клиента.

Список доменов Google меняется не так часто, поэтому вы можете сохранить список на стороне сервера, а затем динамически сгенерировать .js для его проверки.

...