如何在Swift中检查URL的有效性?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中检查URL的有效性?相关的知识,希望对你有一定的参考价值。
尝试使应用程序启动默认浏览器到URL,但仅当输入的URL有效时,否则会显示一条消息,指出URL无效。
我如何使用Swift检查有效性?
如果您的目标是验证您的应用程序是否可以打开网址,那么您可以执行此操作。虽然safari可以打开Url,但网站可能不存在或者可能已关闭。
func verifyUrl (urlString: String?) -> Bool {
//Check for nil
if let urlString = urlString {
// create NSURL instance
if let url = NSURL(string: urlString) {
// check if your application can open the NSURL instance
return UIApplication.sharedApplication().canOpenURL(url)
}
}
return false
}
这将返回URL有效性的布尔值,如果传递值为nil的可选URL,则返回nil。
url.scheme == "http" || url.scheme == "https"
请注意,如果您打算使用Safari视图,则应测试import Foundation
import UIKit
extension URL {
init?(withCheck string: String?) {
let regEx = "((https|http)://)((\w|-)+)(([.]|[/])((\w|-)+))+"
guard
let urlString = string,
let url = URL(string: urlString),
NSPredicate(format: "SELF MATCHES %@", argumentArray: [regEx]).evaluate(with: urlString),
UIApplication.shared.canOpenURL(url)
else {
return nil
}
self = url
}
}
。
Swift 4.2优雅的URL构造与验证
var imageUrl: URL? {
if let url = URL(withCheck: imageString) {
return url
}
if let url = URL(withCheck: image2String) {
return url
}
return nil
}
用法
extension String {
var isValidUrlNaive: Bool {
var domain = self
guard domain.count > 2 else {return false}
guard domain.trim().split(" ").count == 1 else {return false}
if self.containsString("?") {
var parts = self.splitWithMax("?", maxSplit: 1)
domain = parts[0]
}
return domain.split(".").count > 1
}
}
这不是一个正则表达式的方法,但它是一个天真的方法,如果你想要一个简单而廉价的方法,确保有一个主机和一个扩展:
extension String {
func isStringLink() -> Bool {
let types: NSTextCheckingResult.CheckingType = [.link]
let detector = try? NSDataDetector(types: types.rawValue)
guard (detector != nil && self.characters.count > 0) else { return false }
if detector!.numberOfMatches(in: self, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) > 0 {
return true
}
return false
}
}
//Usage
let testURL: String = "http://www.google.com"
if testURL.isStringLink() {
//Valid!
} else {
//Not valid.
}
仅当您想要快速检查客户端并且您具有在保存数据之前将进行更严格检查的服务器逻辑时,才使用此选项。
Shachar
建议只使用此检查一次,然后重复使用。
附:致if let url = URL(string: urlString), url.host != nil {
// This is a correct url
}
的功能。
在某些情况下,检查URL是否满足RFC 1808就足够了。有几种方法可以做到这一点。一个例子:
Task <DF46917D-1A04-4E76-B54E-876423224DF7>.<72> finished with error - code: -1002
这是因为.host,以及.path,.fragment和其他一些方法如果url不符合RFC 1808将返回nil。
如果您不检查,您可能在控制台日志中有这种消息:
func isValid(urlString: String) -> Bool
{
if let urlComponents = URLComponents.init(string: urlString), urlComponents.host != nil, urlComponents.url != nil
{
return true
}
return false
}
试试这个:
class func verifyUrl (urlString: String?) -> Bool {
//Check for nil
if let urlString = urlString {
// create NSURL instance
if let url = URL(string: urlString) {
// check if your application can open the NSURL instance
return UIApplication.shared.canOpenURL(url)
}
}
return false
}
这只是检查有效的URL组件,以及主机和URL组件是否为零。此外,您只需将其添加到扩展文件即可
对于swift 4,您可以使用:
public static func verifyUrl (urlString: String?) -> Bool {
//Check for nil
if let urlString = urlString {
// create NSURL instance
if let url = NSURL(string: urlString) {
// check if your application can open the NSURL instance
return UIApplication.shared.canOpenURL(url as URL)
}
}
return false
}
这是针对最新的Swift 4,基于Doug Amos的回答(适用于swift 3)
qazxswpoi
使用NSDataDetector
的Swift 4优雅解决方案:
extension String {
var isValidURL: Bool {
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
if let match = detector.firstMatch(in: self, options: [], range: NSRange(location: 0, length: self.utf16.count)) {
// it is a link, if the match covers the whole string
return match.range.length == self.utf16.count
} else {
return false
}
}
}
用法:
let string = "https://www.fs.blog/2017/02/naval-ravikant-reading-decision-making/"
if string.isValidURL {
// TODO
}
使用NSDataDetector
而不是UIApplication.shared.canOpenURL
背后的推理:
我需要一种方法来检测用户是否提供了输入是某个东西的URL。在许多情况下,用户不会在他们输入的URL中包含http://
和https://
URL方案 - 例如,他们将在"http://www.google.com"
中输入"www.google.com"
而不是UIApplication.shared.canOpenURL
。如果没有URL方案,false
将无法识别URL并将返回NSDataDetector
。 http://
与``相比,是一个相当宽容的工具(如评论中提到的@AmitaiB) - 它甚至可以检测没有SFSafariViewController
方案的URL。通过这种方式,我可以检测URL,而无需在每次测试字符串时尝试添加方案。
旁注 - http://
只能使用https://
/ func verifyUrl(urlString: String?) -> Bool {
if let urlString = urlString {
if let url = URL(string: urlString) {
return UIApplication.shared.canOpenURL(url)
}
}
return false
}
打开网址。因此,如果检测到的URL没有指定URL方案,并且您想要打开该链接,则必须手动添加该方案。
对于接受答案的快速3版本:
func verifyUrl(urlString: String?) -> Bool {
guard let urlString = urlString,
let url = URL(string: urlString) else {
return false
}
return UIApplication.shared.canOpenURL(url)
}
或者更多Swifty解决方案:
func isStringLink(string: String) -> Bool {
let types: NSTextCheckingResult.CheckingType = [.link]
let detector = try? NSDataDetector(types: types.rawValue)
guard (detector != nil && string.characters.count > 0) else { return false }
if detector!.numberOfMatches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, string.characters.count)) > 0 {
return true
}
return false
}
使用'canOpenUrl'对我的用例来说太贵了,我发现这种方法更快
func canOpenURL(string: String?) -> Bool {
guard let urlString = string else {return false}
guard let url = NSURL(string: urlString) else {return false}
if !UIApplication.sharedApplication().canOpenURL(url) {return false}
//
let regEx = "((https|http)://)((\w|-)+)(([.]|[/])((\w|-)+))+"
let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx])
return predicate.evaluateWithObject(string)
}
我发现这一个干净(在Swift中):
if canOpenURL("abc") {
print("valid url.")
} else {
print("invalid url.")
}
用法:
func canOpenURL(_ string: String?) -> Bool {
guard let urlString = string,
let url = URL(string: urlString)
else { retu以上是关于如何在Swift中检查URL的有效性?的主要内容,如果未能解决你的问题,请参考以下文章