gpt4 book ai didi

lua - 将 POSIX 正则表达式移植到 Lua 模式 - 意外结果

转载 作者:行者123 更新时间:2023-12-04 19:14:02 25 4
gpt4 key购买 nike

我很难将 POSIX 正则表达式移植到 Lua 字符串模式。

我正在处理 html 响应,我想从中过滤复选框已检查。特别是我对 valuename 字段感兴趣每个选中的复选框:

以下是我感兴趣的复选框示例:

<input class="rid-2 form-checkbox" id="edit-2-access-comments" name="2[access comments]" value="access comments" checked="checked" type="checkbox">

<input class="rid-3 form-checkbox real-checkbox" id="edit-3-administer-comments" name="3[administer comments]" value="administer comments" checked="checked" type="checkbox">

相反,我对此不感兴趣(未选中的复选框):

<input class="rid-2 form-checkbox" id="edit-2-access-printer-friendly-version" name="2[access printer-friendly version]" value="access printer-friendly version" type="checkbox">

使用 POSIX 正则表达式,我在 Python 中使用了以下模式:pattern=r'name="(.*)"value="(.*)"checked="checked"' 并且它刚刚工作。

我在 Lua 中的第一个方法就是简单地使用这个:pattern ='name="(.-)"
value="(.-)"checked="checked"'
但它给出了奇怪的结果(第一次捕获符合预期,但第二个返回了很多不需要的 html)。

我也试过以下模式:
pattern = 'name="(%d?%[.-%])"value="(.-)"%s?(c?).-="?c.-"%s?type="checkbox"'

这一次,在第二次捕获 value 的内容被返回但是所有匹配的复选框(不仅是那些带有 checked="checked" 字段的)

为了完整起见,这里是 Lua 代码(来 self 的 Nmap NSE 脚本的片段)尝试进行这种模式匹配:

  pattern = 'name="(.-)" value="(.-)" checked="checked"' 
data = {}
for name, value in string.gmatch(res.body, pattern) do
stdnse.debug(1, string.format("%s %s", name, value))
end

最佳答案

I've used following pattern in Python: pattern=r'name="(.*)" value="(.*)" checked="checked"' and it just worked.

python re不符合 POSIX 标准且 .匹配除换行符以外的任何字符(在 POSIX 和 Lua 中,. 匹配任何字符,包括换行符)。

如果你想匹配一个字符串有3个以上的属性,你应该使用类似的东西

local pattern = 'name="([^"]*)"%s+value="([^"]*)"%s+checked="checked"'

为什么不 [^\r\n]- ?因为如果一行中有两个标签,第一个标签具有第一个和/或第二个属性,第二个标签具有第二个和第三个属性,或者只有第二个标签(即使有第三个标签具有第三个属性,而第一个标签包含前两个属性),将会匹配,如[^\r\n]火柴<>并且可以在标签中“过火”。

请注意 [^"]* , 一个否定的括号表达式,将只匹配除 " 之外的 0+ 个字符从而将匹配限制在一个标签内。

参见 Lua demo :

local rx = 'name="([^"]*)"%s+value="([^"]*)"%s+checked="checked"'
local s = '<li name="n1"\nvalue="v1"><li name="n2"\nvalue="v1" checked="checked"><li name="n3"\nvalue="v3" checked="checked">'
for name, value in string.gmatch(s, rx) do
print(name, value)
end

输出:

n2  v1
n3 v3

关于lua - 将 POSIX 正则表达式移植到 Lua 模式 - 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32885465/

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