JavaScript函数只匹配Google URL

JavaScript函数只匹配Google URL,javascript,greasemonkey,Javascript,Greasemonkey,需要一个函数,如: function isGoogleURL(url) { ... } 返回真正属于谷歌的iff URL。无假阳性;没有假阴性 幸运的是,作为参考: .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.g

需要一个函数,如:

function isGoogleURL(url) { ... }
返回真正属于谷歌的iff URL。无假阳性;没有假阴性

幸运的是,作为参考:

.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.google.bs.google.co.bw.by.google.com.bz.google.ca.google.cd.google.cg.google.ch.google.ci.google.co.ck.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.es.google.com.et.google.fi.google.google.com.fj.google.fm.fj.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.google.hu.google.co.id.google.ie.google.co.il.google.im.google.co.in.google.is.google.it.google.je.je.google.com.jm.google.jo.google.co.ko.ke.google.kh.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.mv.google.mx.google.com.my.google.co.mz.google.com.na.google.com.nf.ng.google.ni.nl.google.no.google.com.np.google.nr.google.nu.google.co.nz.google.com.om.google.com.pa.google.com.pe.google.com.pk.google.pl.google.pn.google.com.pr.google.pt.google.com.py.google.com.qa.google.ro.google.ru.rw.google.google.com.sa.google.com.sb.google.sc.google.se.google.com.sg.sh.google.si.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.uy.google.co.uz.google.com.vc.google.co.ve.google.vg.google.co.vi.google.com.vn.google.vn.vu.google.google.ws.rs.google.co.za.google.co.zm.google.co.zw.google.cat

你知道如何优雅地做这件事吗

一些澄清:

  • 我写的greasemonkey脚本目前只适用于google.com(应该也适用于所有其他TLD),我需要这个脚本。是脚本(它修改Google Reader以更好地在宽屏幕上工作)
  • 它应该适用于属于上述域(而不是blogger.com等)的URL

您是否将谷歌的其他财产计算为“属于谷歌”?FeedBurner、Blogger等


请问这是为了什么?也许有更好的方法来做你想做的事。。。如果合理的话,我可以在内部为您询问。

我不会在客户端这样做


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

如果没有一个正则表达式来单独匹配每个TLD,就没有一个真正的“优雅方式”。正则表达式可能是您所需要的。 例如:

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

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

var elem=document.getElementById(“a”);
var regex=newregexp(“(http://)?(www\\)?google\\.com”);
elem.innerHTML=regex.test(elem.innerHTML);
这将获得span元素“a”的内容,如果google.com,则将其更改为“true”,否则将更改为“false”。 请注意,它不考虑所有其他URL(尽管正则表达式可以很容易地修改为这样做),例如“页面。谷歌。”不匹配。


此外,您的URL前面都有一个“.”(“google.com”而不是“google.com”)。这是有原因的还是只是一个错误?

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

"(http://)?([\w]+)?\.google\.([\w]{2,3})"
在大多数情况下,仅仅测试“.google.”的存在就足够了,尽管在url中添加“google”域很容易被愚弄(虽然不是那么容易,也不是很快就能做到)


或者等待谷歌购买他们自己的谷歌TLD。

你可以使用一个正则表达式,比如

^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(或您选择的任何语言)将相对容易。

我同意您可能不应该这样做。。。但是,如果您打算这样做(并且您不满足于之前提供的只检查类似谷歌模式的解决方案),那么我会这样做:

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\u DOMAINS
变量只是一个字符串,用于保存从发布的url返回的内容。您无法通过AJAX或iframe检索该字符串,因为您无法跨域发出这样的请求。您必须对其进行硬编码或请求服务器端检索该列表。

这里是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”和“google.com”外,所有域都以“google.xx”、“google.co.xx”或“google.com.xx”结尾,因此,如果您只查看域,此正则表达式应适用于大多数情况(它并不完美,但它接受所有列出的域,并拒绝大多数其他碰巧包含“google”的有效域):

作为一项功能,您可以执行以下操作:

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);
}
唯一允许误报的方法是如果存在“谷歌(其他TLD)”。例如,“google.tv”不在列表中(它重定向到google.com),但它会通过

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