質問

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

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で動作するはずです。
役に立ちましたか?

解決

ここに、Prestaulの回答の更新版があり、そこでコメントで言及した2つの問題を解決しています。

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

他のヒント

すべてのドメインは、" google.xx"、" google.co.xx&quot ;、または" 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。(some other TLD)"がある場合です。たとえば、" google.tv"はリストにありません(google.comにリダイレクトされます)が、合格します。

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

他のGoogleサービスを「Googleに属している」とみなしていますか? FeedBurner、Bloggerなど?

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

テストが100%正確である必要がない場合、この単純な正規表現は、上記で投稿したすべてのドメインに対して実行します。

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

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

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

おそらくこれを行うべきではないことに同意します...しかし、あなたがそれをやろうとするなら(そしてグーグルのようなパターンをチェックするだけの以前に提供されたソリューションに満足していなければ)、これはアプローチ方法:

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

これは、URLのドメインに基づいて正規表現を作成し、それを使用してドメインのリストをテストします。

注: GOOGLE_DOMAINS 変数は、投稿したURLから返されたコンテンツを保持する単なる文字列です。ドメイン間でこのようなリクエストを行うことはできないため、AJAXまたはiframeを介してその文字列を取得する方法はありません。そのリストを取得するには、ハードコードするか、サーバー側でリクエストを行う必要があります。

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

これは、URLのドメインに基づいて正規表現を作成し、それを使用してドメインのリストをテストします。

注: GOOGLE_DOMAINS 変数は、投稿したURLから返されたコンテンツを保持する単なる文字列です。ドメイン間でこのようなリクエストを行うことはできないため、AJAXまたはiframeを介してその文字列を取得する方法はありません。そのリストを取得するには、ハードコードするか、サーバー側でリクエストを行う必要があります。

必要なのは正規表現かもしれません。 例は次のとおりです。

<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および&quot; false&quot;の場合さもないと。 他のすべてのURLは考慮されないことに注意してください(正規表現は簡単に変更できますが)。たとえば、&quot; pages.google.com&quot;は一致しません。

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

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

^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(または選択した言語)で配列または他のデータセットから生成するのは比較的簡単だと思います。

このクライアント側は実行しません。

Googleドメインのリストはそれほど頻繁には変更されないため、リストをサーバー側に保存してから、動的に.jsを生成して確認できます。

各TLDに個別に一致する正規表現がなければ、「エレガントな方法」は実際にはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top