2016-07-29 6 views
0

htmlソースのutf8 htmlエンティティを実際の文字に置き換えたい。私は "エンティティ"置換テーブルを持っています。このテーブルにはコードがついています。このコードを実行すると、CPUを最大100%利用します。私のCPUを100%利用している私のルアコード

最初のループをより良い方法で書き直す方法を教えてください。私はLuaの文字列が不変であることを理解しているので、データ変数のコピーがたくさんあると思います。これが理由です。

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 

答えて

0

EDIT:誤った質問ですので、同じ原則で書き直してください。

this answerによれば、patternの中のstrのすべての一致でカスタム置換を実行するのにstr:gsub(pattern, function)を使用できます。

パターン&#.+;はすべてのutf文字と一致していなければなりません。一致するものはfunctionです。

コールバックfunctionに残されていることは、人間が判読可能な一致するものを見つけることですchar、それを置換値として戻すことです。このため、文字列でentitiesがキー入力されていれば、それぞれの値がcharであるため、毎回entitiesを繰り返す必要はありません。

別の編集:lua documentation on gsubによると、2番目のパラメータはテーブルにすることができます。その場合、ルックアップは自動的に行われ、各マッチをキーとして使用して、そのテーブルの値で置き換えようとします。あなたは文字の配列を置換する別の方法がありますentities

+0

しかし、それは逆です。 utfの値をキーにします。それらは複数の文字を取ります。 –

+0

確かに。私はその質問を完全に間違って読んだ。これは難しくなりますが、あなたは同じ原則を使用することができます。 –

+0

標準的な正規表現ではないので、私はルアのパターンマッチングを読む時間を与えてください。 –

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

を再構築後にそれはきれいな解決策になります。

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 
関連する問題