【问题标题】:How to check valid url?如何检查有效的网址?
【发布时间】:2015-08-08 19:59:28
【问题描述】:

如何检查 NSURL 是否有效? 1)如果我输入“facebook.com”,那么它应该添加“http://www”。

2)如果我输入“www.facebook.com”,那么它应该添加“http://”

3) 如果我输入“facebook”,那么它应该在 google 上搜索。

我怎样才能做到这一点??

我正在按照以下方式执行此操作,但它不起作用。对于第三种情况,它总是返回 true。("http://www.facebook")

if (![url.absoluteString.lowercaseString hasPrefix:@"http://"])
    {
        if(![url.absoluteString.lowercaseString hasPrefix:@"www."])
        {
            url = [NSURL URLWithString:[@"http://www." stringByAppendingString:locationField.text]];

        }
        else
        {
            url = [NSURL URLWithString:[@"http://" stringByAppendingString:locationField.text]];
        }
    }
if(![self validateUrl:url.absoluteString])
{
     url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/search?q=%@",[locationField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
}


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

【问题讨论】:

  • 为这个url.absoluteString添加一个nslog,并粘贴结果
  • 你的逻辑不正确。对于 URL facebook,您最终将其更改为 http://www.facebook,然后对其进行验证。
  • @Walucas nslog = absoluteString=facebook
  • @rmaddy 我怎么知道,是 facebook 还是 facebook.com?
  • 检查字符串是否以有效的 TLD 结尾。

标签: ios objective-c search nspredicate nsurl


【解决方案1】:

如果用户输入facebook.com,则无需添加www.http:// 就足够了。无论如何,以下功能可以吃有或没有www.

func checkURL(url: String ) -> Bool {    
    let urlRegEx = "^http(?:s)?://(?:w{3}\\.)?(?!w{3}\\.)(?:[\\p{L}a-zA-Z0-9\\-]+\\.){1,}(?:[\\p{L}a-zA-Z]{2,})/(?:\\S*)?$"
    let urlTest = NSPredicate(format: "SELF MATCHES %@", urlRegEx)
    return urlTest.evaluateWithObject(url)
}

checkURL("http://www.россия.рф/") // true
checkURL("http://www.facebook.com/") // true
checkURL("http://www.some.photography/") // true
checkURL("http://facebook.com/") // true

checkURL("http://www.россия/") // false
checkURL("http://www.facebook/") // false
checkURL("http://www.some/") // false
checkURL("http://facebook/") // false

checkURL("http://россия.рф/") // true
checkURL("http://facebook.com/") // true
checkURL("http://some.photography/") // true
checkURL("http://com/") // false

【讨论】:

  • 您假设最后有 2 或 3 个字母的 TLD。那么“信息”和许多超过 3 个字母的新 TLD 呢?
  • 谢谢,它正在工作,但正如@rmaddy 所说,超过 3 个字母,它不会工作?
  • @Rox 固定为 4 个字母的顶级域名
  • 那么 .travel 等呢?
  • 所有非英文字符的域呢?一个简单的正则表达式并不真正适用于当今可能的域名。
【解决方案2】:

在 Swift 2 中,

    func verifyUrl (str: String?) -> Bool {
     //Check for nil
     var urlString = str!
     if urlString.hasPrefix("http://") || urlString.hasPrefix("https://"){

     }else{
         urlString =  "http://" + urlString
     }
     let userURL:String =  urlString

     let regex = try? NSRegularExpression(pattern: "((https|http)://)((\\w|-|m)+)(([.]|[/])((\\w|-)+))+", options: .CaseInsensitive)
     return regex?.firstMatchInString(userURL, options: [], range: NSMakeRange(0, userURL.characters.count)) != nil
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多