0

我有一些用于表单字段验证的正则表达式。

我有一个单元测试来定义预期的结果

NSArray *suiteWebs = [NSArray arrayWithObjects:
                      @"http://webapp.stackoverflow.net",
                      @"http://webapp.stackoverflow.net/info.php",
                      @"http://www.stackoverflow.net",
                      @"http://www.stackoverflow.net/",
                      @"https://webapp.stackoverflow.net",
                      @"https://webapp.stackoverflow.net/info.php",
                      @"https://www.stackoverflow.net",
                      @"https://www.stackoverflow.net/"
                      @"webapp.stackoverflow.net",
                      @"webapp.stackoverflow.net/info.php",
                      @"www.stackoverflow.net",
                      @"www.stackoverflow.net/",
                      @"www.stack-overflow.com",
                      @"www.stackoverflow_.com",
                      @"www.stackover_flow.com",
                      nil];

NSArray *falseSuiteWebs = [NSArray arrayWithObjects:
                           @"ftp://webapp.stackoverflow.net",
                           @"http:/www.stackoverflow.net",
                           @"ftps://webapp.stackoverflow.net",
                           @"https:/www.stackoverflow.net",
                           nil];

for (NSString *web in suiteWebs) {
    NSLog(@"Validating web %@", web);
    STAssertTrue([TSAddEntityForm validateWeb:web withPatter:currentRegex], [NSString stringWithFormat:@"currentRegex web %@", web]);
}

for (NSString *web in falseSuiteWebs) {
    NSLog(@"Validating web %@", web);
    STAssertFalse([TSAddEntityForm validateWeb:web withPatter:currentRegex], [NSString stringWithFormat:@"currentRegex web %@", web]);
}

我的实际正则表达式是下一个:

NSString *webRegex4 = @"((http|https)://){0,1}((\\w)*|([0-9]*)|([\\-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([\\-|_])*))+";

我的问题与域有关 - 我的正则表达式不验证它。例如 url www.stack-overflow.com 被拒绝

有什么建议么?

谢谢

4

2 回答 2

2

在你的情况下,这个正则表达式可能会更好(它并不理想,但适用于上述合适和坏的样本):

(http(s)?://)?[\w-]+(\.[\w-]+)*\.\w{2,6}[/\w.-]*

它可以从 http:// 或 https:// 开始,

[\w-]+(\.[\w-]+)*\.\w{2,6}- 描述域

[/\w.-]*- 文件夹和文件

于 2013-02-20T13:01:18.713 回答
1

一般来说,复杂的正则表达式是傻瓜的黄金。对多个正则表达式使用多次传递。独立验证 URL 的组件。

复杂的正则表达式可能非常强大,但也可以将您描绘成一个脆弱的角落,其中包含一些像 URL 一样开放式的东西。

此外,如果您使用的是 Objective-C,很容易使用 NSURL 提供的一些工具来分解事物。NSURL 也会让你很好地了解应该查看 URL 的哪些组件。通过使用 NSURL 方法来提取 URL 的组件,您可以更仔细地将正则表达式应用于每个组件。

CFURL 同样强大。

于 2013-02-20T13:37:17.247 回答