如果写成 dnsDomainIs(host, "v2ex.com")的话,那么,当 host=="www.v2ex.com"或 host=="v2ex.com"时,是否都为 true ?我在 Chrome 上测试时,确实是如此,但是,网上大量的文档,包括一些很权威性的网站,Mozilla、Oracle、websense 之类的,都没有详细说明这一点,从列出的例子来看,应该是不包含 www 时才为真,有些例子则是当匹配串为".v2ex.com"时,www 为真,不带 www 则为假,真的有点混乱了。。。
本站上有些人认为的这么牛 B 的 js,语法难道这么不严谨?还是我没找到真正的网站?
1
pq OP 我目前的 pac 中写法是这样的:
shExpMatch(host, "(*.ggpht.com|ggpht.com)") 这是照网上的例子写的,可以正常工作,但我觉得不够优雅,一个域名重复写了两遍,浪费存贮器,作为强迫症,于是我才上网找语法,结果发现另一个函数 dnsDomainIs 或许可以直接搞定,我的想法是,匹配串只写一个 domain_name,不管 host 有或没有二级域名甚至更多级域名,都返回真。 |
2
yangg 2017-11-27 14:35:36 +08:00
源码
"function dnsDomainIs(host, domain) {\n" " return (host.length >= domain.length &&\n" " host.substring(host.length - domain.length) == domain);\n" "}\n" see https://github.com/ldx/libpac/blob/master/nsProxyAutoConfig.h |
3
pq OP @yangg 这么说来,匹配串直接写成"v2ex.com"的话,完全可以匹配 www.v2ex.com 或 v2ex.com 了?那各网站的那些例子为嘛要脱裤子放屁,还在后面加一个 || host == 'v2ex.com'呢? websense 上有关 pac 的例子就那样写的。
|
5
pq OP @yangg 下面这个例子加上你贴的源码提醒了我,匹配串开头还是要加上'.':
dnsDomainIs("www.notmycompany.com", "mycompany.com") returns true dnsDomainIs("www.myCompany.com", "mycompany.com") returns false 否则会出问题。 不过,我加上.后在 Chrome 里试了一下,居然仍能匹配不带 www 的 host,按照你的源码,这种情况下 host.length 是小于 domain.length 的,host=="v2ex.com"; domain==".v2ex.com"; |
6
yangg 2017-11-27 15:51:59 +08:00 1
|
7
autoxbc 2017-11-28 03:57:53 +08:00 1
function dnsDomainIs(host, domain)
{ return new RegExp('\\b'+domain+'$').test(host); } >>> dnsDomainIs('v2ex.com','v2ex.com') true >>> dnsDomainIs('www.v2ex.com','v2ex.com') true >>> dnsDomainIs('notv2ex.com','v2ex.com') false >>> dnsDomainIs('v2ex.com.cn','v2ex.com') false |
10
autoxbc 2017-11-29 03:12:15 +08:00 1
仔细看了一下,#7 的代码没有对 "." 转义,匹配边界有问题
>>> dnsDomainIs('v2exycom.cn','v2ex.com.cn') true 应该改成这样 function dnsDomainIs(host,domain) { return new RegExp( '\\b' + domain.replace(/\./g,'\\.') + '$' ).test(host); } 考虑到正则的性能问题,又写了个非正则版,实测性能好 1~3 倍 function dnsDomainIs(host,domain) { var idx = host.length - domain.length ; return (host == domain) || (idx > 0 && host.lastIndexOf('.' + domain) == idx - 1); } |