2014-07-15 2 views
3
- (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 определяет URL-адрес или строку поиска?

Так как же адресная строка 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. 
+2

[Chromium] (http://www.chromium.org/Home) - с открытым исходным кодом. – funroll

+0

@funroll Я знаю, такой огромный код. Я искал «mobi» в своем коде, не нашел ничего, что захочу. – Gank

ответ

2

можно было бы найти ответ через Chromium как funroll упоминалось, но вот основная идея о том, что происходит, по крайней мере, по моему тестированию.

Строка вводится в «многофункционального поля» определяется быть URL, если он соответствует формату:

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

Где субдомены (которые не являются обязательными, конечно) и доменным имя и содержат только буквы (для Chrome, это, по-видимому, включает буквы с акцентом), цифры, пробелы и дефисы, а домен TLD/верхнего уровня - из утвержденных list-.com, .net и т. д. , если не указан протокол , и в этом случае любой ДВУ считается действительным. Протоколы также поступают из набора списков, но могут быть практически в любом формате с двоеточием после любого количества косых черт. Если протокол не является частью списка, весь URL-адрес рассматривается как поиск.

Если в приведенном выше URL-адресе (например, stackoverflow.com/) есть косая черта после строки, то что-нибудь потом работает.

В качестве альтернативы, если в начале строки появляется косая черта, Chrome рассматривает ее как URL-адрес (с протоколом file://).


Примеры действительных URL-адреса (в соответствии с Chrome):

  • stackoverflow.com
  • abc.stackoverflow.com
  • abc.abc.abc.abc.stackoverflow .com
  • stáckoverflow.com (это изменяет URL-адрес, но разрешено-попробовать!)
  • stack-overflow.com
  • -stackoverflow.com (не может быть даже юридическим доменным именем, но он работает)
  • 4stackoverflow.com
  • stackoverflow.com
  • stackoverflow.com/not допустимых символов ! @ # $^æ
  • [HTTP]: //stackoverflow.com (скобки не законным, но я не могу включить ссылку иначе)
  • [HTTP]: //// StackOverflow .com
  • [http]: stack overflow.com
  • [http]: stackoverflow.mynewtld

Примеры недействительных URL-адресов:

  • стек overflow.com
  • StackOverflow * .com
  • стек/overflow.com
  • stackoverflow.mynewtld

И, ну, почти все остальное.


Будем надеяться, что есть библиотека, там где-то, чтобы сделать все это вместо того, чтобы.

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, поэтому я, наконец, использую этот код небольшой ошибки.

Смежные вопросы