提问人:Assaf Lavie 提问时间:11/4/2008 最后编辑:Assaf Lavie 更新时间:6/14/2011 访问量:1546
仅匹配 Google 网址的 JavaScript 函数
JavaScript function to match only Google URLs
问:
需要以下函数:
function isGoogleURL(url) { ... }
返回 true 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
有什么想法可以优雅地做到这一点吗?
一些澄清:
- 我需要这个来制作我编写的 greasemonkey 脚本,该脚本目前仅适用于 google.com(并且也应该适用于所有其他 TLD)。这是脚本(它修改了 Google Reader 以更好地在宽屏幕上工作)。
- 它应该适用于属于上述域(而不是 blogger.com 等)的 URL。
答:
您是否将其他 Google 媒体资源视为“属于 Google”?FeedBurner、Blogger 等?
我能问一下这样做的目的是什么吗?也许有更好的方法来做你想做的事......如果合理的话,我可以在内部要求你。
评论
我不会在客户端做这个。
Google 域列表不会经常更改,因此您可以在服务器端存储列表,然后动态生成 .js 进行检查。
评论
如果没有一个正则表达式来单独匹配每个顶级域名,就没有真正的“优雅的方式”。
正则表达式可能是您所需要的。 例如:
<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”不会匹配。
此外,您的 URL 前面都有一个“.”(“.google.com”而不是“google.com”)。这有什么原因还是只是一个错误?
如果您不需要 100% 准确的测试,这个简单的正则表达式将适用于您上面发布的所有域:
"(http://)?([\w]+)?\.google\.([\w]{2,3})"
在大多数情况下,只需测试“.google.”的存在就足够了,尽管在URL中添加“google”域很容易被愚弄(虽然不是那么容易,也不是很快完成)。
或者只是等待谷歌购买他们自己的谷歌顶级域名。
评论
您可以使用正则表达式,例如......
^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 的域创建一个正则表达式,并使用它来测试域列表。
注意:该变量只是一个字符串,用于保存从您发布的网址返回的内容。您无法通过 AJAX 或 iframe 检索该字符串,因为您无法跨域发出此类请求。您必须对其进行硬编码或在服务器端发出请求才能检索该列表。GOOGLE_DOMAINS
评论
这是 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”的大多数其他有效域):
/^(\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.tv”不在列表中(它会重定向到 google.com),但它会通过。
编辑:正如 Wimmel 所指出的,它也接受未列出的无效域名,例如“google.com.fr”。它基本上可以接受任何“google.whatever”域名。
评论