0

如何在 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];
 }
4

5 回答 5

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 类型,而是更容易验证。

希望这可以帮助。

于 2013-09-09T05:55:23.527 回答
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;
}

您还可以将 URL 转换为合法 URL,例如

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

欲了解更多信息检查stringByAddingPercentEscapesUsingEncoding:

于 2013-09-09T05:37:59.837 回答
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");
}
于 2013-09-09T05:42:37.363 回答
1

虽然我很欣赏寻找正则表达式来验证 URL 的努力,但当您想使用此 URL 来实际访问资源时,这通常是不够的。从语法上讲,它可能是正确的,但是有无数原因导致此 url 无论如何都无法与服务器一起使用 - 例如,服务器拒绝的查询字符串中的无法识别的标记。

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

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

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

  1. 使用异步方法返回结果
  2. 检查错误
于 2013-09-09T09:17:04.403 回答
0

如果您想使用 http:// 检查 url,那么您可以使用低于常规到期时间。例子 :

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

-(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 --- 真
  2. example.com --- 错误
  3. http://www.example.com --- 错误

 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];
}
于 2014-10-15T08:56:18.030 回答