Chrome 地址栏如何确定它是 URL 还是搜索字符串?

Gan*_*ank 5 url google-chrome objective-c

- (BOOL) validateUrl: (NSString *) candidate {
    NSString *urlRegEx =
    @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
    if( [urlTest evaluateWithObject:candidate]
            ||[candidate containsString:@".com"]
            ||[candidate containsString:@".net"]
            ||[candidate containsString:@".org"]
            ||[candidate containsString:@".cn"]
            ||[candidate containsString:@".jp"]
           )
    {
       return TRUE;
    }

    return  FALSE;
}
Run Code Online (Sandbox Code Playgroud)

这是一长串 URL 域名,“.com”、“.net”、“.org”等。人们不需要在前面或地址栏中输入“http”。

那么 Chrome 地址栏是如何判断是 URL 还是搜索字符串的呢?

If I input "a.fa", it's not an URL.
"a a.com",it's a search string.
"a.mobi/aaa", it's an URL.
Run Code Online (Sandbox Code Playgroud)

use*_*tbd 2

可以通过 Chromium 找到答案,正如 funroll 提到的 \xe2\x80\x94 但这是正在发生的事情的基本想法,至少根据我的测试。

\n\n

输入到“多功能框”中的字符串如果遵循以下格式,则被确定为 URL:

\n\n

[protocol][subdomains].[subdomains].[domain name].[tld]

\n\n

其中子域名(当然是可选的)和域名都只包含字母(对于 Chrome,这似乎包括重音字母)、数字、空格和连字符,并且 TLD/顶级域名来自批准的列表\ xe2\x80\x94.com、.net 等\xe2\x80\x94除非指定了协议,在这种情况下,任何 TLD 都被视为有效。协议也来自一组列表,但可以采用几乎任何格式,并在任意数量的斜杠后面加上冒号。如果协议不是设置列表的一部分,则将整个 URL 视为搜索。

\n\n

如果上述 URL 格式中的字符串后面有一个斜杠(例如 stackoverflow.com/),则后面的任何内容都有效。

\n\n

或者,如果字符串开头出现斜杠,Chrome 也会将其视为 URL(带有file://协议)。

\n\n
\n\n

有效的例子(根据 Chrome):

\n\n
\n
    \n
  • stackoverflow.com
  • \n
  • abc.stackoverflow.com
  • \n
  • abc.abc.abc.abc.stackoverflow.com
  • \n
  • st\xc3\xa1ckoverflow.com(这会更改 URL,但允许\xe2\x80\x94尝试一下!)
  • \n
  • stack-overflow.com
  • \n
  • -stackoverflow.com(甚至可能不是合法域名,但它有效)
  • \n
  • 4stackoverflow.com
  • \n
  • stackoverflow.com
  • \n
  • stackoverflow.com/无效字符!@#$^\xc3\xa6
  • \n
  • [http]://stackoverflow.com(括号不是合法,但我不能包含该链接)
  • \n
  • [http]:////stackoverflow.com
  • \n
  • [http]:stackoverflow.com
  • \n
  • [http]:stackoverflow.mynewtld
  • \n
\n
\n\n

无效的例子

\n\n
\n
    \n
  • 堆栈溢出.com
  • \n
  • stackoverflow*.com
  • \n
  • stack/overflow.com
  • \n
  • stackoverflow.mynewtld
  • \n
\n\n

而且,好吧,还有其他一切。

\n
\n\n
\n\n

我们只是希望有一个图书馆可以代替这一切。

\n