Lua Nginx替换HTML输出

所以我使用Lua将其用于替换来自Nginx服务器的响应页面的HTML输出,以使值="*"的HTML标记为空。

问题在于Lua替换字符串后,失去了我的HTML的结尾,使得在同一行中的其他部分消失了。

Lua代码:

body_filter_by_lua_block{
local body = ngx.arg[1] --将body放入本地变量中
local htmlvaluetomakeempty = "id=\"username\" value="
local loginpagematch = ngx.re.match(body, "" .. htmlvaluetomakeempty .. "\"(?:.*)\"") --在body中搜索我们是否找到了匹配的HTML
if loginpagematch then --如果不是空
body = ngx.re.gsub(body, "" .. htmlvaluetomakeempty .. "\"(?:.*)\"", "" .. htmlvaluetomakeempty .. "\"\"") --.. loginpagematch["match"] )
ngx.arg[1] = body
end
}

将由Lua替换的HTML代码:

<div class="login-fields"><label id="username-lbl" for="username" class="">用户名</label> <input type="text" name="username" id="username" value="test" class="validate-username" size="25"/></div>

Lua运行并修改主体内容后,输出如下:

<div class="login-fields"><label id="username-lbl" for="username" class="">用户名</label> <input type="text" name="username" id="username" value=""/></div>

问题是这个HTML代码也因某些未知原因被删除了:

class="validate-username" size="25"

它成功地使id="username" value=""为空,但我也失去了之后的任何HTML,并且我不知道为什么。

点赞
用户1471119
用户1471119

使用正则表达式处理 HTML 通常是徒劳无功的。输入中的空格变化甚至会完全破坏您的脚本。建议您只是使用 HTML 解析库,例如lua-gumbo

以下示例将查找“input#username”元素,并将其“value”属性设置为空字符串:

local gumbo = require "gumbo"

local input = [[
<div class="login-fields">
    <label id="username-lbl" for="username" class="">User Name</label>
    <input type="text" name="username" id="username" value="test" class="validate-username" size="25"/>
</div>
]]

local document = assert(gumbo.parse(input))
local element = assert(document:getElementById("username"))
element:setAttribute("value", "")
local output = assert(document:serialize())
io.write(output, "\n")
2017-08-16 06:24:46