Lua模式匹配“修复”HTML代码

时间:2011-06-16 16:31:21

标签: string lua design-patterns

我有很多格式错误的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

2 个答案:

答案 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")