我正在查看tumblr bookmarklet中的代码,很好奇下面的代码是做什么的。
try{
if(!/^(.*\.)?tumblr[^.]*$/.test(l.host))
throw(0);
tstbklt();
}
有人能告诉我if行是在测试吗?我试图解码正则表达式,但一直无法解决。
答案 0 :(得分:5)
最初排除正则表达式的细节,此代码为:
if ( ! /.../.test(l.host) )
“如果不是regex.matches(l.host)”或“如果l.host与此正则表达式不匹配”
因此,正则表达式必须正确描述l.host文本的内容,以使条件失败,从而避免抛出错误。
关于正则表达式本身:
^(.*\.)?tumblr[^.]*$
这是检查tumblr
是否存在但仅在可能存在的.
结尾的任何字符串之后:
^ # start of line
( # begin capturing group 1
.* # match any (non-newline) character, as many times as possible, but zero allowed
\. # match a literal .
) # end capturing group 1
? # make whole preceeding item optional
tumblr # match literal text tumblr
[^.]* # match any non . character, as many times as possible, but zero allowed
$ # match end of line
我认为这是测试主机是否是tumblr
是的,看起来似乎有意检查,但如果是这样的话,这是错误的做法。
为此,第一位应该类似于^(?:[\w-]+\.)?
来捕获字母数字子域(?:
是非捕获组,[\w-]+
至少是1个字母数字,下划线或连字符)最后一位应该是\.(?:com|net|org)$
或者像(?:\.[a-zA-Z]+)+$
,取决于tld部分可能需要的灵活性。
答案 1 :(得分:1)
我试图将其分解。我不是正则表达式的专家:
<强> if(!/
强> ^(。)?tumblr [^。] 的$ /测试(l.host))
这部分不是真正的正则表达式,但告诉我们如果这个测试不起作用,只执行if()。
如果(!/的 ^(.*\.)?tumblr
强> [^。] * $ /测试(l.host))
此部分允许在tumblr词之前的任何字符,只要它们后跟.
但它都是可选的(请参见最后的?
)
如果(!/ ^(。*)。?tumblr ** [^.]*$/
**。试验(l.host))
接下来,它匹配除了之外的任何字符。然后*$
扩展它以匹配任何字符(因此它不会在1之后中断)并且它一直有效直到字符串结束。
最后,.test()
看起来针对当前主机名或l.host包含的内容进行测试(我不熟悉tumblr bookmarklet)
所以基本上,看起来该部分正在检查,如果主机不是tumblr的一部分,那么抛出该异常。
期待看到我有多错误:)