我有很多格式错误的HTML,我试图使用Lua来解决这个问题
<p class='heading'>my useful information</p>
<p class='body'>lots more text</p>
我想用
代替<h2>my useful information</h2>
<p class='body'>lots more text</p>
我想要使用的是以下Lua函数,它传递整个html页面。 我怎么会有两个问题,我希望gsub传递整个匹配的替换函数,包括顶部和尾部,然后我将替换顶部和尾部并返回字符串。另一个问题是我的内部替换功能无法看到顶部和尾部字段。
很抱歉,如果这是显而易见的,但我还在学习Lua。
function topandtailreplace(str,top,tail,newtop,newtail)
local strsearch = top..'(.*)'..tail
function replace(str)
str = string.gsub(str,top,newtop)
str = string.gsub(str,tail,newtail)
return str
end
local newstr = str:gsub(strsearch,replace())
return newstr
end
答案 0 :(得分:3)
这似乎有效:
s=[[
<p class='heading'>my useful information</p>
<p class='body'>lots more text</p>
]]
s=s:gsub("<p class='heading'>(.-)</p>","<h2>%1</h2>")
print(s)
答案 1 :(得分:0)
您可以使用带有DOM树的HTML解析库,例如lua-gumbo:
luarocks install gumbo
以下示例可以执行您想要的操作:
local gumbo = require "gumbo"
local input = [[
<p class='heading'>my useful information</p>
<p class='body'>lots more text</p>
]]
local document = assert(gumbo.parse(input))
local headings = assert(document:getElementsByClassName("heading"))
local heading1 = assert(headings[1])
local textnode = assert(heading1.childNodes[1])
local new_h2 = assert(document:createElement("h2"))
heading1.parentNode:insertBefore(new_h2, heading1)
new_h2:appendChild(textnode)
heading1:remove()
io.write(document:serialize(), "\n")