Lua模式<li>html标签</li>

我想提取 li 元素中的值并将它们存储到变量中。

例如:

<li>Male</li><li>Hustisford, WI</li><li>United States</li>

但也可能是这样的:

<li>Hustisford, WI</li><li>United States</li>

或没有

我从这里开始:

author_origin = string.gsub(string.gsub(htmlcode,"<li>","#"),"</li>","|")

author_gender, author_orig_city, author_orig_country = string.match(author_origin,"#(.-)|#(.-)|#(.-)|")

=> 这适用于第一个示例,但对于其他情况不适用。

我认为应该像这样,但它没有起作用:

author_gender, author_orig_city, author_orig_country = string.match(author_origin,"[#]?(.-?)[|]?[#]?(.-?)[|]?[#]?(.-?)[|]?")
点赞
用户107090
用户107090

你不能用单个模式来完成它。你需要两个。首先尝试匹配三个字段。如果失败了,则尝试匹配两个字段。而且,你不需要用其他字符替换 HTML 标签。

author_gender, author_orig_city, author_orig_country = string.match(author_origin,"<li>(.-)</li><li>(.-)</li><li>(.-)</li>")
if author_gender==nil then
   author_orig_city, author_orig_country = string.match(author_origin,"<li>(.-)</li><li>(.-)</li>")
end
2014-10-26 22:30:17
用户258523
用户258523

你可以通过获取符合你条件的全部内容,然后在结尾处确定你所需要的内容,从而避免需要多种模式。类似这样的代码。

function extract(s)
    local t = {}
    for v in s:gmatch("<li>(.-)</li>") do
        t[#t + 1] = v
    end

    if #t == 3 then
        return (unpack or table.unpack)(t)
    end

    return nil,(unpack or table.unpack)(t)
end

author_gender, author_orig_city, author_orig_country = extract("<li>Male</li><li>Hustisford, WI</li><li>United States</li>")
print(author_gender, author_orig_city, author_orig_country)
author_gender, author_orig_city, author_orig_country = extract('<li>Hustisford, WI</li><li>United States</li>')
print(author_gender, author_orig_city, author_orig_country)
2014-10-26 23:24:39
用户1471119
用户1471119

如果你需要解析不可预测的 HTML 并且不介意依赖于一个库,你可以使用 lua-gumbo:

local gumbo = require "gumbo"
local input = "<li>Male</li><li>Hustisford, WI</li><li>United States</li>"
local document = gumbo.parse(input)

local elements = document:getElementsByTagName("li")
local gender = elements[1].textContent
local city = elements[2].textContent
local country = elements[3].textContent

print(gender, city, country)
2014-12-29 19:11:38