如何在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并将返回NSDataDetectorhttp://与``相比,是一个相当宽容的工具(如评论中提到的@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的有效性?的主要内容,如果未能解决你的问题,请参考以下文章

检查用户是不是有效 Parse (Swift)

如何使用 Swift 从 URL 获取 HTML 源代码

如果url有效,如何检查iphone应用程序然后加载WebVIew else show alert

从 URL 获取 UIView 的图像 [Swift]

如何在 Java 中检查有效的 URL?

如何检查url在lua中是不是有效?