2016-07-29 8 views
0

Ich möchte utf8 HTML-Entitäten in HTML-Quellen mit echten Zeichen zu ersetzen. Ich habe die Ersatztabelle "Entitäten", die mit Code unterschritten wird. Wenn ich diesen Code benutze, nutzt er meine CPU zu 100%.Mein Lua-Code mit meiner CPU auf 100%

Könnten Sie mir bitte helfen, die erste Schleife besser zu schreiben? Ich verstehe, dass Strings in Lua unveränderlich sind, also denke ich, dass es viele Kopien von Datenvariablen gibt und dies könnte der Grund sein.

local entities = { 
    {["char"]="!", ["utf"]="!"}, 
    {["char"]='"', ["utf"]="""}, 
    {["char"]="#", ["utf"]="#"}, 
    {["char"]="$", ["utf"]="$"}, 
    {["char"]="%", ["utf"]="%"}, 
    {["char"]="&", ["utf"]="&"}, 
    {["char"]="'", ["utf"]="'"}, 
    -- +312 rows more 
}  

local function clear_text(data) 
    for _, e in ipairs(entities) do 
     data = string.gsub(data, e.utf, e.char) 
    end 
    return data 
end 

-- this is just for testing ... replacement in many html sources 
for i=1,200 do 
    local data = some_html_page_source() 
    clear_text(data) 
end 

Antwort

0

EDIT: Misread Frage, so umgeschrieben es mit dem gleichen Prinzip.

Nach this answer können Sie str:gsub(pattern, function) verwenden, um einen benutzerdefinierten Ersatz für alle Spiele von pattern innerhalb str auszuführen.

Das Muster &#.+; sollte mit allen UTF-Zeichen übereinstimmen und für jedes der Übereinstimmungen function aufrufen.

Alles, was im Callback function noch zu tun ist, ist die passende lesbare char zu finden und diese als Ersatzwert zurückzugeben. Zu diesem Zweck wäre es schneller, wenn entities von den Strings utf mit ihren entsprechenden char als Wert codiert wurde, so dass Sie nicht jedes Mal entities durchlaufen müssen.

eine andere Bearbeitung: nach der lua documentation on gsub kann der zweite Parameter eine Tabelle sein. In diesem Fall wird die Suche automatisch durchgeführt und versucht, jede Übereinstimmung als Schlüssel zu verwenden und sie durch den Wert aus dieser Tabelle zu ersetzen. Das wäre die sauberste Lösung sein, wenn Sie entities

+0

Aber das ist rückwärts. Sie möchten, dass der utf-Wert der Schlüssel ist. Und diese nehmen mehrere Charaktere auf. –

+0

In der Tat. Ich habe die Frage völlig falsch verstanden. Dies macht es schwieriger, aber Sie könnten immer noch das gleiche Prinzip verwenden. –

+0

Geben Sie mir einen Moment, um über Lua's Mustervergleich zu lesen, da es kein Standard-Regex ist. –

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 = [[&exist; &euro; &empty; &Delta; &#8364; &#x20AC;]] 

str = str:gsub("&(#?)(.-);", 
    function(prefix, name) 
     if prefix ~= "" then 
     return utf8.char(tonumber("0"..name)) 
     else 
     return html_entities[name] 
     end 
    end 
) 

print(str) 
0

restrukturieren Es gibt einen anderen Weg, um die Folge von Zeichen zu ersetzen.

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