2

次のような関数が必要です。

function isGoogleURL(url) { ... }

これは、URL が Google に属している場合に true を返します。誤検知はありません。偽陰性なし。

幸いなことに、参考としてこれがあります:

.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

これをエレガントに行う方法はありますか?

いくつかの説明:

  • これは、現在 google.com でのみ機能する、私が書いたグリースモンキー スクリプトに必要です (他のすべての TLD でも機能するはずです)。スクリプトは次のとおりです (Google リーダーがワイド スクリーンでより適切に動作するように変更します)。
  • 上記のドメイン (blogger.com などではない) に属する URL で動作するはずです。
4

9 に答える 9

6

これは、コメントで言及した2つの問題を解決する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
于 2008-11-16T18:36:04.547 に答える
2

「google.it.ao」と「google.com」を除くすべてのドメインは、「google.xx」、「google.co.xx」、「google.com.xx」のいずれかで終わるため、ほとんどの場合、この正規表現は機能します (完全ではありませんが、リストされているすべてのドメインを受け入れ、たまたま「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.(some other TLD)」がある場合です。たとえば、「google.tv」はリストにありません (google.com にリダイレクトされます) が、合格します。

編集: Wimmelが指摘したように、リストされていない「google.com.fr」などの無効なドメインも受け入れます。基本的に、「google.whatever」ドメイン名を受け入れます。

于 2008-11-16T19:30:53.267 に答える
1

他の Google プロパティは「Google に属している」と見なされますか? FeedBurner、ブロガーなど?

これの目的は何ですか?あなたが望むことを行うためのより良い方法があるかもしれません...そしてそれが合理的であるならば、私はあなたのために内部的に尋ねることができます.

于 2008-11-03T20:11:06.143 に答える
1

おそらくこれを行うべきではないことに同意します...ただし、それを行う場合(および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 を介してその文字列を取得する方法はありません。そのリストを取得するには、ハードコーディングするか、サーバー側でリクエストを行う必要があります。

于 2008-11-03T20:52:56.263 に答える
1

テストが 100% 正確である必要がない場合は、上記のすべてのドメインに対して次の単純な正規表現を使用できます。

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

「.google」の存在をテストするだけです。URLに「google」ドメインを追加することで簡単にだまされる可能性がありますが、ほとんどの場合は十分です(それほど簡単ではなく、すぐに行うこともできません).

または、Google が独自の Google TLD を購入するのを待ちます。

于 2008-11-03T20:27:53.770 に答える
0

私はこれをクライアント側で行いません。

Google ドメインのリストはそれほど頻繁には変更されないため、リストをサーバー側に保存し、.js を動的に生成してチェックすることができます。

于 2008-11-03T20:12:11.040 に答える
0

...のような正規表現を使用できます。

^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 (または選択した言語) でそれを生成するのは比較的簡単だと思います。

于 2008-11-03T20:45:37.293 に答える
0

正規表現が必要な場合があります。例は次のとおりです。

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

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

これにより、スパン要素「a」のコンテンツが取得され、google.com の場合は「true」に、それ以外の場合は「false」に変更されます。他のすべての URL は考慮されないことに注意してください (正規表現は簡単に変更できますが)。たとえば、"pages.google.com" は一致しません。

また、URL にはすべて「.」が含まれています。それらの前に(「google.com」ではなく「.google.com」)。これには何らかの理由がありますか、それとも単なる間違いですか?

于 2008-11-03T20:15:12.143 に答える
-1

すべての TLD を個別に照合する正規表現がなければ、実際には「エレガントな方法」はありません。

于 2008-11-03T20:13:59.697 に答える