Lua Pattern Matching для «исправления» HTML-кода - PullRequest
1 голос
/ 16 июня 2011

У меня много плохо отформатированного 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 передавал функции замены все совпадение, включая верх и хвост, и затем я заменял верх и хвост и возвращал строку.Другая проблема заключается в том, что моя внутренняя функция замены не может видеть поля top и tail.

Извините, если это очевидно, но я все еще изучаю 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 ]

3 голосов
/ 16 июня 2011

Это похоже на работу:

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)
0 голосов
/ 16 августа 2017

Вы можете использовать библиотеку для разбора HTML с деревом DOM, например, 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")
...