Lua - 从任何 URL 格式中提取 IP 地址

有没有一种单一的 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)

原文链接 https://stackoverflow.com/questions/70506850

点赞
stackoverflow用户936986
stackoverflow用户936986

你的示例已经几乎可以使用,你只需要去掉前面的 .+,以防止吃掉 IP 前面多余的符号。

local ip = s6:match("(%d+%.%d+%.%d+%.%d+)")

不过,这个模式还是比较松散的,会匹配到很多其他的由4个用点分割的数字组成的组合。你可能至少需要将每个数字组限制为3个数字。根据你要编写的脚本的重要性以及用户是否会试图通过输入错误的数据来攻击它来决定是否需要更健壮的模式。

2021-12-28 12:27:22
stackoverflow用户11740758
stackoverflow用户11740758

当您构建包含 ip 的表格时,可以循环遍历它。

例子(在 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+ 的含义是:“单个字符类后跟“-”,也会匹配零个或多个类中的字符序列。”

来源: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)

2021-12-28 15:10:31