Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 验证NSTextField中的字符串是否为有效的IP地址或域名_String_Macos_Validation_Parsing_Swift - Fatal编程技术网

String 验证NSTextField中的字符串是否为有效的IP地址或域名

String 验证NSTextField中的字符串是否为有效的IP地址或域名,string,macos,validation,parsing,swift,String,Macos,Validation,Parsing,Swift,我有一个NSTextField,其中我要求用户输入一个IPv4格式的字符串或域名,如www.example.com。目前,我的代码是: @IBAction func verifyTarget(sender: NSTextFieldCell) { var txtTarget: NSTextFieldCell = sender var strRawTarget: String? = txtTarget.stringValue println("Input: " + strR

我有一个
NSTextField
,其中我要求用户输入一个IPv4格式的字符串或域名,如
www.example.com
。目前,我的代码是:

@IBAction func verifyTarget(sender: NSTextFieldCell) {
    var txtTarget: NSTextFieldCell = sender

    var strRawTarget: String? = txtTarget.stringValue
    println("Input: " + strRawTarget!)
    var URLTarget: NSURL?

    URLTarget = NSURL.URLWithString(strRawTarget)
    if URLTarget {
        println("URL \(URLTarget) is valid!")
    }
    else {
        println("URL \(strRawTarget) is not valid!")
    }
}
一些示例输出:

Input: 
URL  is valid!
Input: adsfasdf
URL adsfasdf is valid!
Input: afe12389hfs. . afopadsf
URL afe12389hfs. . afopadsf is not valid!
Input: 192.292.111.3
URL 192.292.111.3 is valid!
Input: 0.a.0.a
URL 0.a.0.a is valid!
Input: %2
URL %2 is not valid!
Input: %20
URL %20 is valid!

我做错什么了吗

NSURL.URLWithString
根据解码相对或绝对地址的标准对传递给它的URL字符串进行评估,这些标准在以下并非所有可读文档中列出:RFC和。也就是说,您希望验证的只是
NSURL
能够处理的一小部分。您最好使用一两个正则表达式,可能来自:


检查Swift中的IP地址是IPv4还是IPv6

func validateIpAddress(ipToValidate: String) -> Bool {

    var sin = sockaddr_in()
    var sin6 = sockaddr_in6()

    if ipToValidate.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1 {
        // IPv6 peer.
        return true
    }
    else if ipToValidate.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1 {
        // IPv4 peer.
        return true
    }

    return false;
}

新的网络框架具有针对struct IPv4Address和struct IPv6Address的可故障初始值设定项,可以非常轻松地处理IP地址部分。在IPv6中使用正则表达式执行此操作对于所有缩短规则来说都是困难的

不幸的是,我不能解决域名部分

请注意,网络框架是最新的,因此它可能会迫使您为最新的OS版本进行编译

    import Network
let tests = ["192.168.4.4","fkjhwojfw","192.168.4.4.4","2620:3","2620::33"]

for test in tests {
    if let _ = IPv4Address(test) {
        debugPrint("\(test) is valid ipv4 address")
    } else if let _ = IPv6Address(test) {
        debugPrint("\(test) is valid ipv6 address")
    } else {
        debugPrint("\(test) is not a valid IP address")
    }
}

output:
"192.168.4.4 is valid ipv4 address"
"fkjhwojfw is not a valid IP address"
"192.168.4.4.4 is not a valid IP address"
"2620:3 is not a valid IP address"
"2620::33 is valid ipv6 address"

@Alin中的代码以更紧凑的形式出现:

extension String {
func isIPv4() -> Bool {
    var sin = sockaddr_in()
    return self.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1
}

func isIPv6() -> Bool {
    var sin6 = sockaddr_in6()
    return self.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1
}

func isIpAddress() -> Bool { return self.isIPv6() || self.isIPv4() }
}
用法:

let ipv6 = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"
let ipv6Collapsed = "FE80::0202:B3FF:FE1E:8329"
let ipv4 = "19.117.63.126"

ipv6.isIpAddress()  //true
ipv6.isIPv6()       //true
ipv6.isIPv4()       //false

ipv6Collapsed.isIpAddress() //true
ipv6Collapsed.isIPv6()      //true
ipv6Collapsed.isIPv4()      //false

ipv4.isIpAddress()  //true
ipv4.isIPv6()       //false
ipv4.isIPv4()       //true

基于
@Nate-Cook
更新为Swift 5.1

@iAction func verifyTarget(发送方:NSTextFieldCell){
guard let strawTarget=sender.stringValue else{print(“无输入!”);return}
打印(“输入:+STRAWTARGET)
如果strRawTarget.isValidIpAddress{
打印(\(strRawTarget)是有效的IP地址)
}否则,如果strRawTarget.isValidHostname{
打印(“\(strRawTarget)是有效的主机名”)
}否则{
打印(\(strawTarget)无效)
}
}
枚举正则表达式{
静态let ipAddress=“^([0-9]|[1-9][0-9]| 1[0-9]{2}2[0-4][0-9]| 25[0-5])\\{3}([0-9]|[1-9][0-9]| 1[0-9]{2}2[0-4][0-9]| 25[0-5])”
静态let hostname=“^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\\*([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])”
}
扩展字符串{
变量IsValidIP地址:Bool{
返回self.matches(模式:Regex.ipAddress)
}
变量isValidHostname:Bool{
返回self.matches(模式:Regex.hostname)
}
私有函数匹配(模式:字符串)->Bool{
返回自我范围(的:模式,
选项:。正则表达式,
范围:零,
地点:nil)!=nil
}
}

不,它仍然不起作用(??)我完全复制/粘贴了你的代码。事实上,我似乎无法得到任何无效的字符串。他们都说“有效IP地址”。对可选的解包裹有点粗心——用工作版本更新了代码。嗨,你能在Swift 4.2版本中提供这个答案吗?你能详细说明一下这是如何解决这个问题的吗?只有代码的答案通常是不被鼓励的。这个答案很好,在Swift 4中对我很有用。谢谢你,阿林!请注意,
IPv4Address(“33”)
IPv4Address(“169.254.8.8%en0”)
返回的不是零。
extension String {
func isIPv4() -> Bool {
    var sin = sockaddr_in()
    return self.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1
}

func isIPv6() -> Bool {
    var sin6 = sockaddr_in6()
    return self.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1
}

func isIpAddress() -> Bool { return self.isIPv6() || self.isIPv4() }
}
let ipv6 = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"
let ipv6Collapsed = "FE80::0202:B3FF:FE1E:8329"
let ipv4 = "19.117.63.126"

ipv6.isIpAddress()  //true
ipv6.isIPv6()       //true
ipv6.isIPv4()       //false

ipv6Collapsed.isIpAddress() //true
ipv6Collapsed.isIPv6()      //true
ipv6Collapsed.isIPv4()      //false

ipv4.isIpAddress()  //true
ipv4.isIPv6()       //false
ipv4.isIPv4()       //true