Validation d'URL dans Swift

Dans mon projet iOS Swift, je veux vérifier si l'URL est valide ou non avant de requestr au server. Je l'ai fait plus tôt dans le code Objective C pour vérifier de nombreux éléments comme la présence de www, http, https,:, etc pour valider si la bonne url ou non. Avons-nous quelque chose de similaire dans le code Swift?

Je m'attends comme cette méthode Obj C.

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

Veuillez suggérer.

Vous pouvez utiliser la méthode ssortingngByAddingPercentEscapesUsingEncoding pour replace tous les caractères spéciaux que votre lien peut avoir, puis vous pouvez vérifier si votre lien est une URL valide utilisant NSURL (ssortingng 🙂 comme suit:

 let link = "http://www.yourUrl.com".ssortingngByRemovingPercentEncoding!.ssortingngByAddingPercentEscapesUsingEncoding(NSUTF8SsortingngEncoding)! if let checkedUrl = NSURL(ssortingng: link) { // you can use checkedUrl here } 

Note: NSURL (ssortingng 🙂 est seulement pour weblinks. Si vous souhaitez créer un file NSURL pour un file de ressources local, vous devez utiliser NSURL (fileURLWithPath 🙂

J'ai un problème avec la réponse la mieux notée ici. Je pense que c'est carrément faux pour deux raisons:

Premièrement , le ssortingngByAddingPercentExcapedUsingEncoding codera deux fois les URL valides, les rendant ainsi invalides ou au less différentes de l'input d'origine. Si la string d'input est déjà une URL correctement codée, vous devriez simplement l'utiliser.

Par exemple, http://foo.com/My%20Stuff/ deviendra http://foo.com/My%2520Stuff/ ce qui n'est pas la même chose. Si vous l'alimentez en NSURL, il sera en fait décodé en une URL avec un % littéral.

Deuxièmement , NSURL est connu pour être très mauvais à reconnaître une mauvaise input. Par exemple, il returnne heureusement un résultat non nul lorsque vous lui donnez quelque chose comme x/3:()foo/blah qui est clairement mal formé et pas une URL valide.

Je pense qu'il est préférable d'utiliser une expression régulière. Je ne pense pas qu'il y ait quoi que ce soit dans Foundation qui puisse correctement valider les URL.

Essaye ça.

 func validateUrl (urlSsortingng: Ssortingng?) -> Bool { let urlRegEx = "(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+" return NSPredicate(format: "SELF MATCHES %@", urlRegEx).evaluateWithObject(urlSsortingng) } 

Je suggère d'utiliser une expression régulière comme celle-ci. Le model ci-dessous est correct pour l'URL.

 let regex = NSRegularExpression(pattern: "/^(https?:\/\/)?([\da-z\.-]+)\.([az\.]{2,6})([\/\w \.-]*)*\/?$/",options: nil, error: nil)! if regex.firstMatchInSsortingng(searchTerm!, options: nil, range: NSMakeRange(0, searchTerm!.length)) != nil { println("not valid url ") } 

Les vérifications de code suivantes pour http://google.com ou http://www.google.com , l'ont également cochée pour http://9gag.com mais sans tag http ou https, cela ne fonctionnera pas. Si vous manquez le nom de domaine (google dans ce cas), il affichera une erreur.

 func checkGivenUrl(userURL:Ssortingng) -> Bool { let userURL:Ssortingng = userURL do { let checkReg = try NSRegularExpression(pattern: "(http|https)://([AZ]|[az].)|([AZ]|[az]|[0-9]+)*.([az]|[AZ])", options: .CaseInsensitive) if checkReg.firstMatchInSsortingng(userURL, options: .ReportCompletion, range: NSMakeRange(0, userURL.lengthOfBytesUsingEncoding(NSUTF8SsortingngEncoding))) != nil { if let url = NSURL(ssortingng: userURL) { if UIApplication.sharedApplication().canOpenURL(url) { return true } } return false } } catch { print("Error") } return false } 

L'appel de fonction va comme

 requestedURL = "http://google.com" if checkGivenUrl(requestedURL!) == true { performSegueWithIdentifier("gotoWebView", sender: self) } else{ let alert = UIAlertController(title: "Failed", message: "Enter a valid URL", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "Dismiss", style: .Cancel, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } } 

Veuillez commenter si vous trouvez des cas de test qui ne correspondent pas à la méthode ci-dessus. Je vais essayer de les résoudre 🙂

J'ai trouvé que c'est assez facile à faire

 func validateUrl() -> Bool { let urlRegEx = "((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+" return NSPredicate(format: "SELF MATCHES %@", urlRegEx).evaluate(with: self) } 

Je trouve cela facile. Si vous mettez en extension ou juste dans la class, vous pouvez dire

 func fooBar(textField: UITextField) { if textField == someTextField { if textField.text?.validateUrl() == true { print("true") } else { print("false") } } } 

Très semblable à d'autres réponses tho, et des années de retard

Cela ne nécessite pas la partie http, j'ai l'printing que la plupart des users ne prendraient pas la peine de taper http ou https comme http://www.google.com mais plutôt google.com ou http://www.google.com

De toute évidence, vous pouvez faire le mile supplémentaire et vérifier si elles ont fait ou n'ont pas mis le http (s) et si vous voulez vraiment l'append, ajoutez-le vous-même .. ou pas

J'ai une autre solution. Dans Swift 3

 import Foundation import UIKit extension Ssortingng { var canOpenURL : Bool { guard let url = NSURL(ssortingng: self) else {return false} if !UIApplication.shared.canOpenURL(url as URL) {return false} let regEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+" let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx]) return predicate.evaluate(with: self) } } 

Il peut être utilisé comme

 if textField == someTextField { if (self.textField.text?.canOpenURL)! { //URL valid }else { //URL invalid } }