305 lines
7.6 KiB
Lua
305 lines
7.6 KiB
Lua
|
|
|
|||
|
|
|
|||
|
|
string._htmlspecialchars_set = {}
|
|||
|
|
string._htmlspecialchars_set["&"] = "&"
|
|||
|
|
string._htmlspecialchars_set["\""] = """
|
|||
|
|
string._htmlspecialchars_set["'"] = "'"
|
|||
|
|
string._htmlspecialchars_set["<"] = "<"
|
|||
|
|
string._htmlspecialchars_set[">"] = ">"
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将特殊字符转为 HTML 转义符
|
|||
|
|
~~~ lua
|
|||
|
|
print(string.htmlspecialchars("<ABC>"))
|
|||
|
|
-- 输出 <ABC>
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 转换结果
|
|||
|
|
]]
|
|||
|
|
function string.htmlspecialchars(input)
|
|||
|
|
for k, v in pairs(string._htmlspecialchars_set) do
|
|||
|
|
input = string.gsub(input, k, v)
|
|||
|
|
end
|
|||
|
|
return input
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将 HTML 转义符还原为特殊字符,功能与 string.htmlspecialchars() 正好相反
|
|||
|
|
~~~ lua
|
|||
|
|
print(string.restorehtmlspecialchars("<ABC>"))
|
|||
|
|
-- 输出 <ABC>
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 转换结果
|
|||
|
|
]]
|
|||
|
|
function string.restorehtmlspecialchars(input)
|
|||
|
|
for k, v in pairs(string._htmlspecialchars_set) do
|
|||
|
|
input = string.gsub(input, v, k)
|
|||
|
|
end
|
|||
|
|
return input
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将字符串中的 \n 换行符转换为 HTML 标记
|
|||
|
|
~~~ lua
|
|||
|
|
print(string.nl2br("Hello\nWorld"))
|
|||
|
|
-- 输出
|
|||
|
|
-- Hello<br />World
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 转换结果
|
|||
|
|
]]
|
|||
|
|
function string.nl2br(input)
|
|||
|
|
return string.gsub(input, "\n", "<br />")
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将字符串中的特殊字符和 \n 换行符转换为 HTML 转移符和标记
|
|||
|
|
~~~ lua
|
|||
|
|
print(string.nl2br("<Hello>\nWorld"))
|
|||
|
|
-- 输出
|
|||
|
|
-- <Hello><br />World
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 转换结果
|
|||
|
|
]]
|
|||
|
|
function string.text2html(input)
|
|||
|
|
input = string.gsub(input, "\t", " ")
|
|||
|
|
input = string.htmlspecialchars(input)
|
|||
|
|
input = string.gsub(input, " ", " ")
|
|||
|
|
input = string.nl2br(input)
|
|||
|
|
return input
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
用指定字符或字符串分割输入字符串,返回包含分割结果的数组
|
|||
|
|
~~~ lua
|
|||
|
|
local input = "Hello,World"
|
|||
|
|
local res = string.split(input, ",")
|
|||
|
|
-- res = {"Hello", "World"}
|
|||
|
|
local input = "Hello-+-World-+-Quick"
|
|||
|
|
local res = string.split(input, "-+-")
|
|||
|
|
-- res = {"Hello", "World", "Quick"}
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@param string delimiter 分割标记字符或字符串
|
|||
|
|
@return array 包含分割结果的数组
|
|||
|
|
]]
|
|||
|
|
function string.split(input, delimiter)
|
|||
|
|
input = tostring(input)
|
|||
|
|
delimiter = tostring(delimiter)
|
|||
|
|
if (delimiter=='') then return false end
|
|||
|
|
local pos,arr = 0, {}
|
|||
|
|
-- for each divider found
|
|||
|
|
for st,sp in function() return string.find(input, delimiter, pos, true) end do
|
|||
|
|
table.insert(arr, string.sub(input, pos, st - 1))
|
|||
|
|
pos = sp + 1
|
|||
|
|
end
|
|||
|
|
table.insert(arr, string.sub(input, pos))
|
|||
|
|
return arr
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
去除输入字符串头部的空白字符,返回结果
|
|||
|
|
~~~ lua
|
|||
|
|
local input = " ABC"
|
|||
|
|
print(string.ltrim(input))
|
|||
|
|
-- 输出 ABC,输入字符串前面的两个空格被去掉了
|
|||
|
|
~~~
|
|||
|
|
空白字符包括:
|
|||
|
|
- 空格
|
|||
|
|
- 制表符 \t
|
|||
|
|
- 换行符 \n
|
|||
|
|
- 回到行首符 \r
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 结果
|
|||
|
|
@see string.rtrim, string.trim
|
|||
|
|
]]
|
|||
|
|
function string.ltrim(input)
|
|||
|
|
return string.gsub(input, "^[ \t\n\r]+", "")
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
去除输入字符串尾部的空白字符,返回结果
|
|||
|
|
~~~ lua
|
|||
|
|
local input = "ABC "
|
|||
|
|
print(string.ltrim(input))
|
|||
|
|
-- 输出 ABC,输入字符串最后的两个空格被去掉了
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 结果
|
|||
|
|
@see string.ltrim, string.trim
|
|||
|
|
]]
|
|||
|
|
function string.rtrim(input)
|
|||
|
|
return string.gsub(input, "[ \t\n\r]+$", "")
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
去掉字符串首尾的空白字符,返回结果
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 结果
|
|||
|
|
@see string.ltrim, string.rtrim
|
|||
|
|
]]
|
|||
|
|
function string.trim(input)
|
|||
|
|
input = string.gsub(input, "^[ \t\n\r]+", "")
|
|||
|
|
return string.gsub(input, "[ \t\n\r]+$", "")
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将字符串的第一个字符转为大写,返回结果
|
|||
|
|
~~~ lua
|
|||
|
|
local input = "hello"
|
|||
|
|
print(string.ucfirst(input))
|
|||
|
|
-- 输出 Hello
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 结果
|
|||
|
|
]]
|
|||
|
|
function string.ucfirst(input)
|
|||
|
|
return string.upper(string.sub(input, 1, 1)) .. string.sub(input, 2)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local function urlencodechar(char)
|
|||
|
|
return "%" .. string.format("%02X", string.byte(char))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将字符串转换为符合 URL 传递要求的格式,并返回转换结果
|
|||
|
|
~~~ lua
|
|||
|
|
local input = "hello world"
|
|||
|
|
print(string.urlencode(input))
|
|||
|
|
-- 输出
|
|||
|
|
-- hello%20world
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 转换后的结果
|
|||
|
|
@see string.urldecode
|
|||
|
|
]]
|
|||
|
|
function string.urlencode(input)
|
|||
|
|
-- convert line endings
|
|||
|
|
input = string.gsub(tostring(input), "\n", "\r\n")
|
|||
|
|
-- escape all characters but alphanumeric, '.' and '-'
|
|||
|
|
input = string.gsub(input, "([^%w%.%- ])", urlencodechar)
|
|||
|
|
-- convert spaces to "+" symbols
|
|||
|
|
return string.gsub(input, " ", "+")
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将 URL 中的特殊字符还原,并返回结果
|
|||
|
|
~~~ lua
|
|||
|
|
local input = "hello%20world"
|
|||
|
|
print(string.urldecode(input))
|
|||
|
|
-- 输出
|
|||
|
|
-- hello world
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return string 转换后的结果
|
|||
|
|
@see string.urlencode
|
|||
|
|
]]
|
|||
|
|
function string.urldecode(input)
|
|||
|
|
input = string.gsub (input, "+", " ")
|
|||
|
|
input = string.gsub (input, "%%(%x%x)", function(h) return string.char(checknumber(h,16)) end)
|
|||
|
|
input = string.gsub (input, "\r\n", "\n")
|
|||
|
|
return input
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
计算 UTF8 字符串的长度,每一个中文算一个字符
|
|||
|
|
~~~ lua
|
|||
|
|
local input = "你好World"
|
|||
|
|
print(string.utf8len(input))
|
|||
|
|
-- 输出 7
|
|||
|
|
~~~
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@return integer 长度
|
|||
|
|
]]
|
|||
|
|
function string.utf8len(input)
|
|||
|
|
if input == nil then return 0 end
|
|||
|
|
if type(input) ~= "string" then return 0 end
|
|||
|
|
local len = string.len(input)
|
|||
|
|
local left = len
|
|||
|
|
local cnt = 0
|
|||
|
|
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
|
|||
|
|
while left ~= 0 do
|
|||
|
|
local tmp = string.byte(input, -left)
|
|||
|
|
local i = #arr
|
|||
|
|
while arr[i] do
|
|||
|
|
if tmp >= arr[i] then
|
|||
|
|
left = left - i
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
i = i - 1
|
|||
|
|
end
|
|||
|
|
cnt = cnt + 1
|
|||
|
|
end
|
|||
|
|
return cnt
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[
|
|||
|
|
截取utf8字符串
|
|||
|
|
@param string input 输入字符串
|
|||
|
|
@param integer index、endIndex 截取的开始和结束索引,如果没有结束索引,就从1截到index
|
|||
|
|
@return string 目标字符串
|
|||
|
|
]]
|
|||
|
|
function string.utf8sub(input, index, endIndex)
|
|||
|
|
if input == nil or type(input) ~= "string" then return nil end
|
|||
|
|
if not endIndex then
|
|||
|
|
endIndex = index
|
|||
|
|
index = 1
|
|||
|
|
end
|
|||
|
|
local len = string.len(input)
|
|||
|
|
local left = len
|
|||
|
|
local cnt = 0
|
|||
|
|
local head, tail = 0, 0
|
|||
|
|
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
|
|||
|
|
while left ~= 0 do
|
|||
|
|
if cnt + 1 == index then
|
|||
|
|
head = len - left + 1
|
|||
|
|
end
|
|||
|
|
local tmp = string.byte(input, -left)
|
|||
|
|
local i = #arr
|
|||
|
|
while arr[i] do
|
|||
|
|
if tmp >= arr[i] then
|
|||
|
|
left = left - i
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
i = i - 1
|
|||
|
|
end
|
|||
|
|
cnt = cnt + 1
|
|||
|
|
if cnt == endIndex or left == 0 then
|
|||
|
|
tail = len - left
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
local rt = string.sub(input, head, tail)
|
|||
|
|
return rt
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[--
|
|||
|
|
将数值格式化为包含千分位分隔符的字符串
|
|||
|
|
~~~ lua
|
|||
|
|
print(string.formatnumberthousands(1924235))
|
|||
|
|
-- 输出 1,924,235
|
|||
|
|
~~~
|
|||
|
|
@param number num 数值
|
|||
|
|
@return string 格式化结果
|
|||
|
|
]]
|
|||
|
|
function string.formatnumberthousands(num)
|
|||
|
|
local formatted = tostring(checknumber(num))
|
|||
|
|
local k
|
|||
|
|
while true do
|
|||
|
|
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
|
|||
|
|
if k == 0 then break end
|
|||
|
|
end
|
|||
|
|
return formatted
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
|
|||
|
|
function string.concat( ... )
|
|||
|
|
local str = {}
|
|||
|
|
local tem = {...}
|
|||
|
|
for _,v in ipairs(tem) do
|
|||
|
|
str[#str + 1] = v
|
|||
|
|
end
|
|||
|
|
return table.concat(str , "")
|
|||
|
|
end
|