2016-11-12 4 views
1

Так что с Lua я использую его для замены вывода HTML на странице ответа с сервера Nginx. Чтобы сделать значение = "*" HTML-тег пустым.Lua Nginx заменяет вывод HTML

Проблема в том, что я продолжаю терять конец своего HTML после того, как Lua заменяет строку и делает то, что когда-либо между котировками, оставил остальную часть моего HTML на той же строке после того, как она исчезла.

Lua Код:

body_filter_by_lua_block { 
local body = ngx.arg[1] --Put body into local var 
local htmlvaluetomakeempty = "id=\"username\" value=" 
local loginpagematch = ngx.re.match(body, "" .. htmlvaluetomakeempty .. "\"(?:.*)\"") --Search through body to see if our html match is found 
if loginpagematch then --If not empty 
body = ngx.re.gsub(body, "" .. htmlvaluetomakeempty .. "\"(?:.*)\"", "" .. htmlvaluetomakeempty .. "\"\"") --.. loginpagematch["match"]) 
ngx.arg[1] = body 
end 
} 

HTML код, который Lua будет заменить:

<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> 

После Lua побежал и изменять содержимое тела вывод выглядит следующим образом

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

Проблема заключается в следующем HTML-код также был удален по неизвестной причине

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

Он успешно делает id="username" value="" пустым, но я теряюсь, что пришел когда-либо HTML после этого тоже, и я не знаю, почему.

+2

Возможно нежадным матч требуется GSUB: ' "\"(?.? *) \ "" –

+0

Спасибо да, вы правы, просто изменили мое регулярное выражение, чтобы оно соответствовало, и проблема решена: D <3 – C0nw0nk

ответ

1

Использование регулярного выражения для управления 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") 
Смежные вопросы