2016-11-12 53 views
1

因此,我使用它來替換來自Nginx服務器響應頁面的HTML輸出。爲了使value =「*」HTML標籤爲空。Lua Nginx替換HTML輸出

問題是我在Lua替換字符串之後不斷丟掉我的HTML的末尾,並且在引號之後,在同一行中刪除了剩餘的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")