1

我正在查看 tumblr 书签中的代码,很好奇下面的代码做了什么。

try{
    if(!/^(.*\.)?tumblr[^.]*$/.test(l.host))
        throw(0);
        tstbklt();
}

谁能告诉我 if 行正在测试什么?我试图解码正则表达式,但无法这样做。

4

2 回答 2

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 部分可能需要。

于 2009-11-01T14:17:13.663 回答
1

我试图打破它。但是,我不是正则表达式的专家:

if(!/^(. .)?tumblr[^.] $/.test(l.host))

这部分不是真正的正则表达式,而是告诉我们仅在此测试不起作用时才执行 if() 。

if(!/ ^(.*\.)?tumblr[^.]*$/.test(l.host))

这部分允许 tumblr 单词之前的任何字符,只要它们后面跟着 a.但这都是可选的(见?最后)

if(!/^(.*.)?tumblr** [^.]*$/**.test(l.host))

接下来,它匹配除 . 之外的任何字符。并且它*$扩展它以匹配之后的任何字符(因此它不会在 1 之后中断)并且它一直工作到字符串的末尾。

最后,.test()根据当前主机名或 l.host 包含的任何内容对其进行测试(我不熟悉 tumblr 小书签)

所以基本上,看起来该部分正在检查是否主机不是 tumblr 的一部分,然后抛出该异常。

期待看到我错了:)

于 2009-11-01T14:16:24.023 回答