2

需要这样的功能:

function isGoogleURL(url) { ... }

返回真 iff 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 .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)的greasemonkey 脚本。是脚本(它修改了 Google Reader 以更好地在宽屏幕上工作)。
  • 它应该适用于属于上述域(而不是 blogger.com 等)的 URL。
4

9 回答 9

6

这是 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.(一些其他 TLD)”。例如,“google.tv”不在列表中(它重定向到 google.com),但它会通过。

编辑:就像 Wimmel 指出的那样,它也接受未列出的无效域,如“google.com.fr”。它基本上会接受任何“google.whatever”域名。

于 2008-11-16T19:30:53.267 回答
1

您是否将其他 Google 资产视为“属于 Google”?FeedBurner、Blogger 等?

能问一下这样做的目的是什么吗?可能有更好的方法来做你想做的事……如果合理的话,我可以在内部为你询问。

于 2008-11-03T20:11:06.143 回答
1

如果您不需要 100% 准确的测试,这个简单的正则表达式将适用于您在上面发布的所有域:

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

只是测试“.google”的存在。在大多数情况下就足够了,尽管在 url 中添加“google”域很容易被愚弄(虽然不是那么容易,也不是很快完成)。

或者只是等待谷歌购买自己的谷歌TLD。

于 2008-11-03T20:27:53.770 回答
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 回答
0

我不会做这个客户端。

Google 域列表不会经常更改,因此您可以在服务器端存储一个列表,然后动态生成 .js 来检查它。

于 2008-11-03T20:12:11.040 回答
0

正则表达式可能是您需要的。一个例子是:

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

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

这将获取 span 元素“a”的内容,如果 google.com 将其更改为“true”,否则将其更改为“false”。请注意,它不考虑所有其他 URL(尽管可以很容易地修改正则表达式来这样做),例如,“pages.google.com”将不匹配。

此外,您的网址都有一个“。” 在他们之前(“.google.com”而不是“google.com”)。这有什么原因还是只是一个错误?

于 2008-11-03T20:15:12.143 回答
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 回答
-1

如果没有正则表达式来单独匹配每个 TLD,就没有真正的“优雅的方式”。

于 2008-11-03T20:13:59.697 回答