【问题标题】:URL Validation function improvingURL Validation 功能改进
【发布时间】:2011-12-20 05:08:07
【问题描述】:

我使用这个函数来检查一个 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];
}

【问题讨论】:

    标签: objective-c regex url-validation


    【解决方案1】:

    这将是我的尝试:

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

    编辑 添加到反向引用(?<=/)以获得额外的特异性

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

    【讨论】:

    • 上述模式适用于google.com,但不适用于google.co.in。请为此提供解决方案。我在哪里可以进行更改.. 为此。所以这两种格式都是验证。
    • @MnuMaster 您好,我已更改搜索模式以解决您提到的问题。请参见上文。
    • 此 reg 表达式不适用于以下链接:edition.cnn.com/2012/02/29/world/europe/russia-election-primer/… 如何修复?
    • @NavaCarmon 你好,纳尔瓦,我看起来只是那个网址中有一个?。如果您喜欢 \\?,可以将其添加到正则表达式的最后一部分
    • 好吧,我在 Microsoft 网站上找到了一些东西,稍作改动,这是迄今为止最好的表达方式 - 请参阅答案。评论太长了,但效果很好
    【解决方案2】:

    尝试将 *regex = 行更改为以下内容。

    NSString *regex = "(http|ftp|https)://[\w-_]+(.[\w-_]+)+([\w-.,@?^= %&:/~+#]* [\w-\@?^=%&/~+#])?"

    【讨论】:

      【解决方案3】:

      嗯,我在 Microsoft 网站上找到了一些东西,稍作改动,这是迄今为止最好的表达方式:

      @"(?:[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])+)\\])";
      

      【讨论】:

        【解决方案4】:

        旧线程,但我认为我的修改可能有助于其他人登陆这里:

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

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

        【讨论】:

          【解决方案5】:
          -(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];
          }
          

          【讨论】:

            猜你喜欢
            • 2022-06-29
            • 2013-03-14
            • 2011-06-12
            • 1970-01-01
            • 2021-05-06
            • 2015-09-26
            • 2017-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多