URL验证功能改进

时间:2011-12-20 05:08:07

标签: objective-c regex url-validation

我使用此功能检查URL是否有效。它适用于大多数情况,但这里返回的以下URL不是有效的!

  

http://www.iphonedevsdk.com/forum/iphone-sdk-development/11841-stringbytrimmingcharactersinset.html

如何改进我的函数的正则表达式,它将覆盖所有的URL类型?

- (BOOL) urlIsValiad: (NSString *) url 
{
    NSString *regex = 
    @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
    NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    if ([regextest evaluateWithObject: url] == YES) {
        NSLog(@"URL is valid!");
    } else {
        NSLog(@"URL is not valid!");
    }

    return [regextest evaluateWithObject:url];
}

5 个答案:

答案 0 :(得分:2)

这将是我的尝试:

((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?

EDIT 在反向引用(?<=/)中添加了额外的特异性

编辑2 在网址中添加了国家/地区名称的可选搜索(例如www.google.com.in)

答案 1 :(得分:1)

尝试使用以下内容更改* regex =行。

NSString * regex =“(http | ftp | https):// [\ w-_] +(。[\ w-_] +)+([\ w - 。,@?^ = %&amp;:/〜+#] * [\ w - \ @?^ =%&amp; /〜+#])?“

答案 2 :(得分:0)

好吧,我在微软网站上发现了一些内容,并且稍有改动,这是迄今为止最好的表达方式:

@"(?:[A-Za-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%\\&'*+/=?\\^_`{|}"

@"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"

@"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-"

@"z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\\[(?:(?:25[0-5"

@"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"

@"9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"

@"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";

答案 3 :(得分:0)

旧线程,但我认为我的修改可能对其他人登陆此处有所帮助:

我不想只检查“www”作为主机名,现在我们可能会遇到不同的主机名...因此我扩展了正则表达式:

"((?:http|https)://)?(?:[A-Za-z0-9]{1,25}\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?"

答案 4 :(得分:0)

-(BOOL)validateUrl{
//    NSString *urlRegEx =  @"((?:http|https)://)?(www\\.)[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
    NSString *urlRegEx =  @"((?:http|https)://)?(www\\.)[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
    if ([urlTest evaluateWithObject: self] == YES) {
        NSLog(@"URL is valid!");
    } else {
        NSLog(@"URL is not valid!");
    }
    return [urlTest evaluateWithObject:self];
}