2015-08-08 1 views
2

Как я могу проверить, что NSURL действителен или нет? 1) Если я нахожу «facebook.com», тогда он должен добавить «http://www».Как проверить действительный URL?

2) Если я вхожу "www.facebook.com", то он должен добавить "HTTP: //"

3) Если я вхожу "Facebook", то он должен искать в гугле.

Как я могу это достичь ??

Я делаю это следующим образом, но он не работает. Он всегда возвращает истину для третьего случая. («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]; 
} 
+0

добавить NSLog для этого url.absoluteString и вставьте результат – Walucas

+0

Ваша логика неверна. Для URL 'facebook' вы в конечном итоге меняете его на' http: // www.facebook', а затем проверяете его. – rmaddy

+0

@Walucas nslog = absoluteString = http: //www.facebook – Rox

ответ

5

Там нет необходимости добавлять www., если пользователь вводит facebook.com. Достаточно было 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 
+1

Вы принимаете 2 или 3 буквы TLD в конце. Как насчет «информации» и многих новых TLD, которые содержат более 3 букв? – rmaddy

+0

Спасибо, он работает, но, как говорит @rmaddy, для более чем трех букв это не сработает? – Rox

+0

@ Rox исправлено для 4-х символов TLD –

0

В быстром 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 
    }