Phr*_*ogz 3 html xml lua html-entities xml-entities
什么是非数字化HTML/XML实体的良好实现,例如 用ASCII等效替换它们?
表示为单元测试:
local orig = "It's the "end" &ok; "
local fixd = unescape(orig) -- Implement this
assert( fixd == "It's the \"end\" &ok;\n" )
Run Code Online (Sandbox Code Playgroud)
这是一个简单的实现,它还处理名为XML实体的核心:
function unescape(str)
str = string.gsub( str, '<', '<' )
str = string.gsub( str, '>', '>' )
str = string.gsub( str, '"', '"' )
str = string.gsub( str, ''', "'" )
str = string.gsub( str, '&#(%d+);', function(n) return string.char(n) end )
str = string.gsub( str, '&#x(%d+);', function(n) return string.char(tonumber(n,16)) end )
str = string.gsub( str, '&', '&' ) -- Be sure to do this after all others
return str
end
print(unescape(""Hello" 'World'")) --> "Hello" 'World'
Run Code Online (Sandbox Code Playgroud)
但是,请注意,对于一个病态情况,这是失败的:数字符号实体后跟文本amp;:
print(unescape("Ampersand entity is &amp;")) --> Ampersand entity is &
-- The result should actually be Ampersand entity is &
Run Code Online (Sandbox Code Playgroud)
我们可以通过一次处理所有实体来修复这个边缘情况,但代码有点丑陋:
function unescape(str)
local map={ ["lt"]="<", ["gt"]=">", ["amp"]="&", ["quot"]='"', ["apos"]="'" }
str = string.gsub( str, '(&(#?x?)([%d%a]+);)', function(orig,n,s)
return (n=='' and map[s])
or (n=="#x" and tonumber(s,16)) and string.char(tonumber(s,16))
or (n=="#" and tonumber(s)) and string.char(s)
or orig
end )
return str
end
print(unescape("Ampersand entity is &amp;")) --> Ampersand entity is &
Run Code Online (Sandbox Code Playgroud)
最后,我们可以以更快的速度打开它:
local gsub, char = string.gsub, string.char
local entityMap = {["lt"]="<",["gt"]=">",["amp"]="&",["quot"]='"',["apos"]="'"}
local entitySwap = function(orig,n,s)
return (n=='' and entityMap[s])
or (n=="#" and tonumber(s)) and string.char(s)
or (n=="#x" and tonumber(s,16)) and string.char(tonumber(s,16))
or orig
end
function unescape(str)
return (gsub( str, '(&(#?x?)([%d%a]+);)', entitySwap ))
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2012 次 |
| 最近记录: |