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

时间:2014-07-15 18:13:58

标签: objective-c google-chrome url

- (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;
}

这是一个很长的URL域名列表,“。com”,“。net”,“。org”等。 人们不需要在前面或地址栏中输入“http”。

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

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.

3 个答案:

答案 0 :(得分:2)

有可能通过Chromium找到答案,正如上面提到的那样 - 但这里是关于发生了什么的基本想法,至少根据我的测试。

如果格式符合以下格式,则输入“omni box”的字符串将被确定为URL:

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

子域名(当然是可选的)和域名都只包含字母(对于Chrome,这似乎包括重音字母),数字,空格和连字符,TLD /顶级域名来自批准list-.com,.net,etc- 除非指定协议,否则任何TLD都被视为有效。协议也来自一个集合列表,但可以是几乎任何格式的冒号跟随任意数量的斜杠。如果协议不是集合列表的一部分,则整个URL将被视为搜索。

如果上述网址格式的字符串后面有斜杠(例如stackoverflow.com/),那么之后的任何内容都会有效。

或者,如果在字符串的开头出现斜杠,Chrome也会将其视为网址(使用file://协议)。


有效网址的示例(根据Chrome):

  
      
  • stackoverflow.com
  •   
  • abc.stackoverflow.com
  •   
  • abc.abc.abc.abc.stackoverflow.com
  •   
  • stáckoverflow.com(这会更改网址,但允许 - 尝试一下!)
  •   
  • stack-overflow.com
  •   
  • -stackoverflow.com(可能不是合法的域名,但它有效)
  •   
  • 4stackoverflow.com
  •   
  • stackoverflow.com
  •   
  • stackoverflow.com/无效的字符!@#$ ^æ
  •   
  • [http]:// stackoverflow.com(括号不是合法,但我不能包含该链接)
  •   
  • [HTTP]:////stackoverflow.com
  •   
  • [HTTP]:stackoverflow.com
  •   
  • [HTTP]:stackoverflow.mynewtld
  •   

无效网址的示例:

  
      
  • stack overflow.com
  •   
  • 计算器* .com的
  •   
  • 堆叠/ overflow.com
  •   
  • stackoverflow.mynewtld
  •   
     

而且,就其他一切而言。


我们希望有一个库可以在那里完成所有这些。

答案 1 :(得分:0)

-(BOOL)doesString:(NSString *)string containCharacter:(char)character
{
    if ([string rangeOfString:[NSString stringWithFormat:@"%c",character]].location != NSNotFound)
    {
        return YES;
    }
    return NO;
}

- (void)openURL:(NSString *)urlString {
   urlString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
   if ([self doesString:urlString containCharacter:'.'])
   {
       if ([urlString rangeOfString:@"http"].location != 0)
        {
            urlString=[@"http://" stringByAppendingString:urlString];
        }
    }
    else
    {
        urlString = [GOOGLE_CODE stringByAppendingString:urlString];
    }

    urlString= [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

我找不到Chrome的搜索栏代码,所以我最终使用了这个小bug的代码。

答案 2 :(得分:0)

回应用户名 tbd 的帖子

注意:在 RFC 921/1123 的域名规范中,定义它们不能以 - 开头,但 - 是有效的内部字符,因此此正则表达式已修改为遵守这一点

编辑:更新以符合 RFC 3986

这是一个正则表达式,用于根据用户名 tbd 的观察检查 url。 一些无效的 url 仍会被标记为有效。这个正则表达式是 Python 风格的,所以如果你使用的是 javascript 或 php,请确保转义 /

((http|https|file)://)?([a-z0-9][a-z0-9\-_~\/:\?#\[\]@!$&\'\(\)\*+,;=]*)(\.[a-z0-9\-_~\/:\?#\[\]@!$&\'\(\)\*+,;=]+)+