Lua - 从任何 URL 格式中提取 IP 地址
Lua - Extract IP address from any URL format
是否有一个 string:match 选项(或替代 Lua 命令)可以确保无论提供的 URL/IP 地址格式如何,我总能提取 IP 地址部分?
这是我到目前为止得到的最远的,但它没有提供完整的 IP 地址。
local s1 = "192.168.19.55"
local s2 = "http://192.168.19.55"
local s3 = "http://192.168.219.55:88"
local s4 = "http://192.168.19.55:88/index.html"
local s5 = "https://192.168.119.102/hello.php"
local s6 = "http://admin:password@192.168.19.55:88/hello.php"
local ip = s6:match(".+(%d+%.%d+%.%d+%.%d+)")
print(ip)
你的例子已经很有效了,你只是不需要前导 .+
从 IP 前面吃掉额外的符号。
local ip = s6:match("(%d+%.%d+%.%d+%.%d+)")
不过,这种模式非常宽松,可以匹配许多其他由点分隔的 4 个数字组。您可能希望至少将每个数字组限制为 3 位数字。根据您正在编写的脚本的重要性以及人们是否会尝试通过向其抛出不良数据来利用它来决定您是否需要更强大的模式。
用ip构造table就可以循环了。
示例(测试于:https://www.lua.org/cgi-bin/demo)
local ips = {"192.168.19.55",
"http://192.168.19.55",
"http://192.168.219.55:88",
"http://192.168.19.55:88/index.html",
"https://192.168.119.102/hello.php",
"http://admin:password@192.168.19.55:88/hello.php"}
for k, v in pairs(ips) do
print(k, v:match("(.-%d+%.%d+%.%d+%.%d+%:-%d+)"))
end
...那就是...
1 192.168.19.55
2 http://192.168.19.55
3 http://192.168.219.55:88
4 http://192.168.19.55:88
5 https://192.168.119.102
6 http://admin:password@192.168.19.55:88
模式项 .-
和 %:-%d+
表示:“单个字符 class 后跟 '-',它也匹配 [=32] 中零个或多个字符的序列=]."
资料来源:https://www.lua.org/manual/5.4/manual.html#6.4.1
尝试使用模式项并在 url 前面使用更多文本进行测试。
喜欢...
local ips = {"GET 192.168.19.55",
"GET http://192.168.19.55",
"GET http://192.168.219.55:88",
"GET http://192.168.19.55:88/index.html",
"POST https://192.168.119.102/hello.php",
"POST http://admin:password@192.168.19.55:88/hello.php"}
for _, v in pairs(ips) do
print(v:match("(%g-%d+%.%d+%.%d+%.%d+%:-%d+)"))
end
(%g
= Lua 5.3 及以上 - %w
= Lua 5.1)
是否有一个 string:match 选项(或替代 Lua 命令)可以确保无论提供的 URL/IP 地址格式如何,我总能提取 IP 地址部分?
这是我到目前为止得到的最远的,但它没有提供完整的 IP 地址。
local s1 = "192.168.19.55"
local s2 = "http://192.168.19.55"
local s3 = "http://192.168.219.55:88"
local s4 = "http://192.168.19.55:88/index.html"
local s5 = "https://192.168.119.102/hello.php"
local s6 = "http://admin:password@192.168.19.55:88/hello.php"
local ip = s6:match(".+(%d+%.%d+%.%d+%.%d+)")
print(ip)
你的例子已经很有效了,你只是不需要前导 .+
从 IP 前面吃掉额外的符号。
local ip = s6:match("(%d+%.%d+%.%d+%.%d+)")
不过,这种模式非常宽松,可以匹配许多其他由点分隔的 4 个数字组。您可能希望至少将每个数字组限制为 3 位数字。根据您正在编写的脚本的重要性以及人们是否会尝试通过向其抛出不良数据来利用它来决定您是否需要更强大的模式。
用ip构造table就可以循环了。
示例(测试于:https://www.lua.org/cgi-bin/demo)
local ips = {"192.168.19.55",
"http://192.168.19.55",
"http://192.168.219.55:88",
"http://192.168.19.55:88/index.html",
"https://192.168.119.102/hello.php",
"http://admin:password@192.168.19.55:88/hello.php"}
for k, v in pairs(ips) do
print(k, v:match("(.-%d+%.%d+%.%d+%.%d+%:-%d+)"))
end
...那就是...
1 192.168.19.55
2 http://192.168.19.55
3 http://192.168.219.55:88
4 http://192.168.19.55:88
5 https://192.168.119.102
6 http://admin:password@192.168.19.55:88
模式项 .-
和 %:-%d+
表示:“单个字符 class 后跟 '-',它也匹配 [=32] 中零个或多个字符的序列=]."
资料来源:https://www.lua.org/manual/5.4/manual.html#6.4.1
尝试使用模式项并在 url 前面使用更多文本进行测试。
喜欢...
local ips = {"GET 192.168.19.55",
"GET http://192.168.19.55",
"GET http://192.168.219.55:88",
"GET http://192.168.19.55:88/index.html",
"POST https://192.168.119.102/hello.php",
"POST http://admin:password@192.168.19.55:88/hello.php"}
for _, v in pairs(ips) do
print(v:match("(%g-%d+%.%d+%.%d+%.%d+%:-%d+)"))
end
(%g
= Lua 5.3 及以上 - %w
= Lua 5.1)