如何验证iPhone应用程序中的URL

时间:2013-09-09 05:36:57

标签: iphone ios url uitextfield

如何检查iphone应用程序,如果URL有效,那么它应该打开它,否则它可能会显示它是无效URL的警告。我正在使用以下代码但问题是,如果我输入www.google.com它显示如果我输入nice.com也有效,也显示有效。

       - (BOOL)textFieldShouldReturn:(UITextField *)textField
      {

       [textField setUserInteractionEnabled:YES];
       [textField resignFirstResponder];
       test=textField.text;

       NSLog(@"Test is working and test is %@",test);

   if ([self  urlIsValiad:test]) {
    NSURL *url = [NSURL URLWithString:test]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [webView setScalesPageToFit:YES];
    [self.webView loadRequest:request]; 
     } else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please enter Valid URL"  message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];
     }

   return YES;



    }

  - (BOOL) urlIsValiad: (NSString *) url 


 {

NSString *regex = 
@"((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
/// OR use this 
///NSString *regex = "(http|ftp|https)://[\w-_]+(.[\w-_]+)+([\w-.,@?^=%&:/~+#]* [\w-\@?^=%&/~+#])?";
NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

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

    test=@"Valid";


}  else {
    NSLog(@"URL is not valid!");

    test=@"Not Valid";


}

return [regextest evaluateWithObject:url];
 }

5 个答案:

答案 0 :(得分:6)

UIApplication类中有一个名为canOpenURL的内置函数。

如果iOS safari可以打开该URL,则返回true / false。

BOOL canOpenGivenURL = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:resultText]];

if (canOpenGivenURL) {

    // URL is valid, open URL in default safari browser
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:resultText]];

    // write your code here
}
else
    // Not valid URL -- show some alert 

不是验证所有可用的URL类型,而是更容易验证。

希望这有帮助。

答案 1 :(得分:5)

如果您想检查URL是否有效,请使用以下RegEx。

NSString *urlString = [NSString stringWithFormat:@"URL_STRING"];
NSString *urlRegEx =
    @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
NSPredicate *urlPredic = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
BOOL isValidURL = [urlPredic evaluateWithObject:urlString];

并设置像

这样的条件
if(isValidURL)
{
  // your URL is valid;
}
else
{
  // show alert message for invalid URL;
}

此外,您还可以将网址转换为合法网址,例如

NSString *urlString = [NSString stringWithFormat:@"URL_STRING"];
NSURL *youURL = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

For more information check stringByAddingPercentEscapesUsingEncoding:

答案 2 :(得分:2)

您可以查看

-(BOOL)isValidURL
{
    BOOL isValidURL = NO;   
    NSURL *candidateURL = [NSURL URLWithString:self];
    if (candidateURL && candidateURL.scheme && candidateURL.host)
        isValidURL = YES;
    return isValidURL;
}

并像这样测试

if([YOUR_TEXTFIELD.text isValidURL]){
   NSLog(@"Valid URL");
}

答案 3 :(得分:1)

虽然我很钦佩找到正则表达式来验证URL的努力,但是当您想要使用此URL来实际访问资源时,这通常是不够的。从语法上讲,可能结果是正确的,但仍有无数的原因,为什么这个url无论如何都不能与服务器一起工作 - 例如,查询中无法识别的令牌服务器拒绝的字符串。

如果您想要防止输入应该看起来像网址的任意垃圾,例如当您想要将此网址保存在数据库中时,此“验证”可能会有所帮助。但是,当您想立即使用它来加载资源时,它毫无意义。

在您的情况下,仅检查URL“在语法上是否有效”是不够的。找出的唯一方法是实际使用它并在加载资源的尝试失败时返回错误代码。认为事先验证会保存一些东西是不正确的,当网址有效并且有效时,这是不必要的成本。

所以,基本上改变你的方法如下:

  1. 使用异步方法返回结果
  2. 检查错误

答案 4 :(得分:0)

如果您想使用http://检查网址,则可以使用以下常规到期时间。 示例:

  1. http://www.example.com --- True
  2. www.example.com ---错误
  3. example.com --- False

  4. -(BOOL) validateUrl: (NSString *) candidate {
        NSString *urlRegEx = @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
        NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
        return [urlTest evaluateWithObject:candidate];
    }
    

    如果你想修复www。在URL中,您可以使用此常规过期。

    示例:

    1. www.example.com --- True
    2. example.com --- False
    3. http://www.example.com ---错误

    4.  NSString *urlRegEx =  @"(www\\.)[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
      
      -(BOOL) validateUrl: (NSString *) candidate {
          NSString *urlRegEx =  @"(www\\.)[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
          NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
          return [urlTest evaluateWithObject:candidate];
      }