我想用真实字符替换html源中的utf8 html实体。我有"实体"用下面的代码遍历的替换表。如果我运行此代码,它使用我的CPU高达100%。
请问您能帮我更好地重写第一个循环吗?我知道在Lua中字符串是不可变的,所以我认为有很多数据变量的副本,这可能是原因。
select t1.id1, t2.id2, t3.id3
from table1 t1
left join table2 t2
on t1.id1 = t2.id2
left join table3 t3
on t2.id2 = t3.id3
UNION
select t1.id1, t2.id2, t3.id3
from table2 t2
left join table3 t3
on t2.id2 = t3.id3
left join table1 t1
on t2.id2 = t1.id1
UNION
select t1.id1, t2.id2, t3.id3
from table3 t3
left join table2 t2
on t3.id3 = t2.id2
left join table1 t1
on t3.id3 = t1.id1;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 3 | 3 | NULL |
| 1 | NULL | NULL |
| 2 | NULL | NULL |
| NULL | 5 | 5 |
| NULL | 4 | NULL |
| NULL | NULL | 6 |
| NULL | NULL | 7 |
------+------+------+
7 rows in set (0.00 sec)
答案 0 :(得分:0)
编辑:误读了问题,所以用同样的原则重写了它。
根据this answer,您可以使用str:gsub(pattern, function)
对pattern
内str
的所有匹配项执行自定义替换。
模式&#.+;
应匹配所有utf字符,为每个匹配调用function
。
在回调function
中剩下要做的就是找到匹配的人类可读的char
,并将其作为替换值返回。为此,如果entities
字符串为utf
键,并且各自的char
为值,则会更快,因此您不必每次都迭代entities
时间。
另一个编辑:根据lua documentation on gsub,第二个参数可以是一个表。在这种情况下,查找是自动完成的,它将尝试使用每个匹配作为键,将其替换为该表中的值。一旦重组entities
答案 1 :(得分:0)
-- Lua 5.3 required
local html_entities = {
nbsp = " ",
lt = "<",
gt = ">",
amp = "&",
euro = "€",
copy = "©",
Gamma = "Γ",
Delta = "Δ",
prod = "∏",
sum = "∑",
forall = "∀",
exist = "∃",
empty = "∅",
nabla = "∇",
isin = "∈",
notin = "∉",
-- + many more rows
}
local str = [[∃ € ∅ Δ € €]]
str = str:gsub("&(#?)(.-);",
function(prefix, name)
if prefix ~= "" then
return utf8.char(tonumber("0"..name))
else
return html_entities[name]
end
end
)
print(str)
答案 2 :(得分:0)
还有另一种替换字符序列的方法。
local function clear_text(data)
return (string.gsub(
data,
[=[[!"#$%&']]=], -- all your entries goes here, between [=[ and ]=]
function(c)
return "&#" .. string.byte(c) .. ";" -- replace with char code
end
))
end
-- this is just for testing ... replacement in many html sources
for i=1,200 do
local data = "!#!#!#!#!#!";
print(clear_text(data))
end