我有一个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!
我做错什么了吗?
8条答案
按热度按时间nwnhqdif1#
检查Swift中的IP地址是否为IPv4或IPv6
uoifb46i2#
NSURL.URLWithString
根据解码相对地址或绝对地址的标准来评估您传递给它的URL字符串,这些标准在以下文档中给出:RFC 2396、1738和1808。也就是说,您希望验证的只是NSURL
所能处理的一小部分。您最好使用一两个RegEx,可能来自this answer:7nbnzgx93#
来自@Alin的代码以更紧凑的形式显示:
用法:
vjhs03f74#
新的网络框架为struct IPv4Address和struct IPv6Address提供了可失败的初始化器,它们非常容易地处理IP地址部分。在IPv6中使用正则表达式做这件事是非常坚韧的。
很遗憾,我不能解决域名部分。
请注意,Network framework是最新的,因此它可能会强制您针对最新的OS版本进行编译。
hiz5n14c5#
基于
@Nate Cook
response更新为Swift 5.1。qlfbtfca6#
iezvtpos7#
尝试以下内容:
只需检查
sockaddr_in
函数是否接受它作为IPv4地址,或者sockaddr_in6
是否接受它作为IPv6地址。vuktfyat8#
我想检查字符串是否是一个IP地址或没有,我发现下面的解决方案,它的工作很好。
用法:
string.isValidIpAddress