JavaScript函数只匹配Google URL

JavaScript function to match only Google URLs

本文关键字:Google URL 函数 JavaScript      更新时间:2023-09-26

需要一个类似的函数

function isGoogleURL(url) { ... }

返回真实的iff URL属于Google。无假阳性;没有假阴性。

幸运的是,有这个作为参考:

.google.com.ad.google.ae.google.com.af.google.com.ag.google.com.ai.google.am.google.am.google.it.ao.googlecom.a.ar.google.as.google.at.google.aat.google.com.cn.au.google.az.google.ba.google.com.bd.google.be.google.be.google.bg.google.com.bb.bo.google.com br.google.bs.google.co.bw.google.com.by.google.com.by-google.com.bz.google.ca.google.ca.谷歌.cd.谷歌.cg.谷歌.ch.谷歌.cigoogle.co.ck。google.cl。google.cn。google.com.co。google.co.cr。google.com.cu。google.cz。google.de。google.dj。谷歌.dk。谷歌.dm。谷歌.com.do。谷歌.dz。谷歌.com.ec。谷歌.ee。谷歌.com.edg。谷歌.es。谷歌.com.ext。谷歌.fi。谷歌.com.fj。谷歌.fm。谷歌.fr。谷歌.ge。谷歌.gg。谷歌.com.gh。谷歌.com.gif。谷歌.gl。谷歌.gm.google.gp.google.gr.google.com.gt.google.gygoogle.com.hk。google.hn。google.hr。google.ht。google.hu。google.co.id。谷歌.ie。谷歌.co.il。谷歌.im。谷歌.co.in。谷歌.is。谷歌.it。谷歌.je。谷歌.com.jm。谷歌.jo。谷歌.co.jp。谷歌.co.ke。谷歌.com.cn.kh。谷歌.ki。谷歌.kg。谷歌.co.kr。谷歌.kz。谷歌.la。谷歌.li。谷歌.lk。谷歌.co.ls。谷歌.lt。谷歌谷歌.lu谷歌.lv谷歌.com.ly谷歌.co.ma谷歌.md谷歌.mn谷歌.ms谷歌.com.mt谷歌.mu谷歌.mv谷歌.mw谷歌.com.mx谷歌.com.my谷歌.co.mz谷歌.com.na谷歌.com.nf谷歌.com.ng谷歌.com.ni谷歌.nl谷歌.no谷歌.com.np谷歌.nr谷歌.nu谷歌.co.nz谷歌.com.om谷歌.com.pa谷歌.com.pe谷歌.com.ph谷歌.com.pk谷歌.pl谷歌.pn谷歌.com.pn.pr.google.pt.google.com.py.google.com.qa谷歌.ro谷歌.ru谷歌.rw谷歌.com.sa谷歌.com.sb谷歌.sc谷歌.se谷歌.com.sg谷歌.sh谷歌.si谷歌.sk谷歌.sn谷歌.sm谷歌.st谷歌.com.sv谷歌.co.th谷歌.com.tj谷歌.tk谷歌.tl谷歌.tm谷歌.to谷歌.com.tr谷歌.tt谷歌.com.tw谷歌.co.tz谷歌.com.ua谷歌.co.ug谷歌co.uk.google.com.uy.google.co.uz.google.com.vcgoogle.co.ve谷歌.vg谷歌.co.vi谷歌.com.vn谷歌.vu谷歌.ws谷歌.rs谷歌.co.za谷歌.co.zm谷歌.co.zw.谷歌.cat

有什么想法可以优雅地做到这一点吗?

一些澄清:

  • 我需要这个来编写一个目前只适用于google.com(也应该适用于所有其他TLD)的防油渍脚本。这是脚本(它修改了谷歌阅读器以更好地在宽屏幕上工作)
  • 它应该适用于属于上述域(而不是blogger.com等)的URL

这是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

除了"google.it.ao"answers"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"。它基本上会接受任何"谷歌.随便什么"域名。

您是否将其他谷歌属性算作"属于谷歌"?FeedBurner,Blogger等?

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

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

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

在大多数情况下,只需测试".google."的存在就足够了,尽管在url中添加一个"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, '''.') + '$', '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"的内容,如果是google.com,则将其更改为"true",否则将更改为"false"。请注意,它没有考虑所有其他URL(尽管regex可以很容易地修改为这样做),例如"pages.google.com"就不匹配。

此外,你的URL前面都有一个"."(".google.com"而不是"google.com")。这有什么原因吗?还是只是一个错误?

您可以使用像…这样的正则表达式。。。。

^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(或者你选择的任何语言)从数组或其他数据集生成它会相对容易。

我不会在客户端这样做。

谷歌域名的列表不会经常更改,所以你可以在服务器端存储一个列表,然后动态生成.js来检查它。

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