- (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.
答案 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)
注意:在 RFC 921/1123 的域名规范中,定义它们不能以 -
开头,但 -
是有效的内部字符,因此此正则表达式已修改为遵守这一点
编辑:更新以符合 RFC 3986
这是一个正则表达式,用于根据用户名 tbd 的观察检查 url。
一些无效的 url 仍会被标记为有效。这个正则表达式是 Python 风格的,所以如果你使用的是 javascript 或 php,请确保转义 /
。
((http|https|file)://)?([a-z0-9][a-z0-9\-_~\/:\?#\[\]@!$&\'\(\)\*+,;=]*)(\.[a-z0-9\-_~\/:\?#\[\]@!$&\'\(\)\*+,;=]+)+