gpt4 book ai didi

Lua 函数检查是否 ipv4 或 ipv6 或字符串

转载 作者:行者123 更新时间:2023-12-04 16:54:41 24 4
gpt4 key购买 nike

我想要一个函数,我可以将一个空格修剪过的字符串传递给它,它将返回 0 表示错误(不是字符串) 1 表示 ipv4 2 表示 ipv6 3 表示不是 ip 的字符串。

IPv6 有以下规则:

ipv6 由 8 组 16 位十六进制值表示,以冒号 (:) 分隔
十六进制数字不区分大小写
缩写规则:
1:省略 16 位值中的前导零
2:用双冒号替换一组或多组连续的零

wiki 示例显示了 3 种完全相同的 ipv6 方式:

fe80:0000:0000:0000:0202:b3ff:fe1e:8329
fe80:0:0:0:202:b3ff:fe1e:8329
fe80::202:b3ff:fe1e:8329

我很确定对于 ipv4,您只需检查三个 .然后检查字符串是否为所有数字并且 .'s 被视为数字,最后一次仅检查字符串将在 if 语句的末尾,因此如果它不是 ipv4/6 并且它是一个字符串,则它返回 3

最佳答案

Mike 的解决方案很好,但可以通过多种方式对其进行改进。在当前形式下,它无法进行 ipv6 地址检查,但很容易修复。 ipv6 检查在 "1050!0!0+0-5@600$300c#326b" 之类的事情上失败和 "1050:0:0:0:5:600:300c:326babcdef" (将两者都识别为有效地址)和 "1050:::600:5:1000::" (将其识别为字符串)。

这是改进版本(假定 IPv4 是十进制数,假定 IPv6 是十六进制数):

function GetIPType(ip)
local R = {ERROR = 0, IPV4 = 1, IPV6 = 2, STRING = 3}
if type(ip) ~= "string" then return R.ERROR end

-- check for format 1.11.111.111 for ipv4
local chunks = {ip:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")}
if #chunks == 4 then
for _,v in pairs(chunks) do
if tonumber(v) > 255 then return R.STRING end
end
return R.IPV4
end

-- check for ipv6 format, should be 8 'chunks' of numbers/letters
-- without leading/trailing chars
-- or fewer than 8 chunks, but with only one `::` group
local chunks = {ip:match("^"..(("([a-fA-F0-9]*):"):rep(8):gsub(":$","$")))}
if #chunks == 8
or #chunks < 8 and ip:match('::') and not ip:gsub("::","",1):match('::') then
for _,v in pairs(chunks) do
if #v > 0 and tonumber(v, 16) > 65535 then return R.STRING end
end
return R.IPV6
end

return R.STRING
end

要检查的脚本:
local IPType = {[0] = "Error", "IPv4", "IPv6", "string"}
local ips = {
"128.1.0.1", -- ipv4
"223.255.254.254", -- ipv4
"999.12345.0.0001", -- invalid ipv4
"1050:0:0:0:5:600:300c:326b", -- ipv6
"1050!0!0+0-5@600$300c#326b", -- string
"1050:0:0:0:5:600:300c:326babcdef", -- string
"1050:0000:0000:0000:0005:0600:300c:326b", -- ipv6
"fe80:0000:0000:0000:0202:b3ff:fe1e:8329", -- ipv6
"fe80:0:0:0:202:b3ff:fe1e:8329", -- ipv6
"fe80::202:b3ff:fe1e:8329", -- ipv6
"1050:::600:5:1000::", -- contracted ipv6
"::", -- ipv6
"::1", -- ipv6
"::1::", -- string
"129.garbage.9.1", -- string
"xxx127.0.0.0", -- error
"xxx1050:0000:0000:0000:0005:0600:300c:326b", -- string
129.10 -- error
}
for k,v in pairs(ips) do
print(v, IPType[GetIPType(v)])
end

和输出:
128.1.0.1   IPv4
223.255.254.254 IPv4
999.12345.0.0001 string
1050:0:0:0:5:600:300c:326b IPv6
1050!0!0+0-5@600$300c#326b string
1050:0:0:0:5:600:300c:326babcdef string
1050:0000:0000:0000:0005:0600:300c:326b IPv6
fe80:0000:0000:0000:0202:b3ff:fe1e:8329 IPv6
fe80:0:0:0:202:b3ff:fe1e:8329 IPv6
fe80::202:b3ff:fe1e:8329 IPv6
1050:::600:5:1000:: IPv6
:: IPv6
::1 IPv6
::1:: string
129.garbage.9.1 string
xxx127.0.0.0 string
xxx1050:0000:0000:0000:0005:0600:300c:326b string
129.1 Error

于 2018 年 9 月 6 日更新,添加地址之前/之后的垃圾处理并检查收缩的 ipv6,这允许少于 8 个组,其中一组为两个连续冒号的空组。

关于Lua 函数检查是否 ipv4 或 ipv6 或字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10975935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com