特定的URL验证

时间:2014-01-26 10:51:58

标签: objective-c regex validation url url-validation

我看到了很多这个问题的副本,但最后发现什么都不适合我。我需要在我的应用程序中验证我的URL,就像在iOS中的Safari应用程序中一样(例如7)。

例如:我需要有效这些字符串: http://apple.com; http://www.apple.com 那些未经过验证http://apple.apple; http://apple; http://www.........something

我想这样做:

    #define stringRegex @"^(http://|https://|http://www.|https://www.)[a-z0-9-.]+(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mn|mn|mo|mp|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|nom|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ra|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw|arpa)([/?].*)?$"

...

         NSString *stringToCheck = searchBar.text;
         if ([stringToCheck rangeOfString:@"https://"].location != NSNotFound) {
                 stringToCheck = [stringToCheck stringByReplacingOccurrencesOfString:@"https://"
                                                                                 withString:@"http://"];
         }
         if ([stringToCheck rangeOfString:@"http://"].location == NSNotFound) {
                 stringToCheck = [NSString stringWithFormat:@"http://%@",stringToCheck];
         }

         NSString * urlAddress = stringToCheck;
         NSError *error = NULL;
         NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:stringRegex options:NSRegularExpressionCaseInsensitive error:&error];
         NSTextCheckingResult *match = [regex firstMatchInString:urlAddress
                                                                 options:0 range:NSMakeRange(0, [urlAddress length])];
         if (match) {
                         NSLog(@"Url is valid");
         }
                 else {
                         NSLog(@"Url isn't valid");
}

最后它在99%的情况下工作,但有时会验证无效的字符串。我不知道为什么。例如:

http://test - 有效; http://thkl - 无效(正确)

所以这就是我要解决的问题。

1 个答案:

答案 0 :(得分:1)

您的正则表达式模式无法确保在最后一次匹配之前有一个句点(点)。所以http://test匹配:

  1. http://
  2. te
  3. st
  4. 您需要更新图案以确保在正确的位置有点。记得逃避点是不是通配符。