【问题标题】:Checking if a string is a url - Objective-C [duplicate]检查字符串是否为 url - Objective-C [重复]
【发布时间】:2011-10-24 10:08:09
【问题描述】:

可能重复:
How to validate an url on the iPhone

在 Objective-C 中,有没有人有一个很好的方法来测试给定的字符串是否看起来是一个 URL?

【问题讨论】:

    标签: iphone objective-c xcode ipad


    【解决方案1】:

    这样做:

    NSURL* url = [NSURL URLWithString:stringToTest];
    if (url && url.scheme && url.host)//This comparision never fails
     {
      //the url is ok
      NSLog(@"%@ is a valid URL", yourUrlString);
     }
    

    如果stringToTest 确实是一个 URL,那么 url 将按预期实例化。否则+[NSURL URLWithString:]返回nil

    Cocoa Touch 中的大多数方法在非法输入时返回nil,实际上很少会抛出NSInvalidArgumentException。每个方法都记录了它们在无效输入时返回的内容。

    【讨论】:

    • 请记住,这将验证任何 URL。因此,即使它是文件 URL 或 Web URL,它们都将通过这种形式的检查验证为真。 Peylow 的回答是对的,我只是想让你知道,Web URL 并不是 NSURL 接受的唯一类型。
    • 另请注意,它会验证部分和相对 URL。因此,检查架构和/或域也是一种很好的做法。
    • 这实际上不起作用。如果字符串为空,或者您只需在字符串“asdf”中输入任何内容,如果 url 不会为 nil 并因此通过此测试。
    • 是的-不适用于 xcode 4.6.3 和 iOS 6 上的 web url。此代码示例仅返回字符串作为 url 的任何内容-我可以将我的名字 simon 作为stringToTest 和 url 以值“simon”结束
    • 它没有工作在下面的步骤中工作.. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; return [NSURLConnection canHandleRequest:request];
    【解决方案2】:

    您可以使用正则表达式。对于 iPhone 3 及更高版本,您可以在没有框架的情况下执行此操作。否则使用 RegexKitLite 之类的。

    这是一个用于检查 URL 的正则表达式模式:

    "(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"
    

    在没有框架的情况下进行:

    - (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];
    }
    

    【讨论】:

    • 使用 NSURL,如 PeyloW 所述。 NSURL 旨在处理完整的 URL 标准;最好不要重新发明轮子。
    • 真相^^ 我忘了 NSUrl。但是如果出于某种原因你想放宽(或者更严格,NSUrl 将接受除 http 和 https 之外的前缀)验证标准,你可能仍然希望能够定义自己的模式。
    • 是的——但您可能希望从 [可能相当复杂的] 一个接受标准的表达式开始,然后退回以支持非标准 URL。或者,最好修复无效 URL 的来源。 :)
    • 嗯。如果它以 www 开头,例如 www.google.com,会怎样?
    • 您可以尝试上面的模式减去 (http|https):// 部分:"((\\w)*|([0-9]*)|([-|_] )*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+" 但就像 bbum 建议的那样,最好强制您的用户提供带有前缀和所有内容的有效 URL
    猜你喜欢
    • 2012-03-26
    • 2015-05-22
    • 2021-07-10
    • 2018-10-17
    • 1970-01-01
    • 2015-04-21
    • 2014-07-06
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多