Lua屏蔽字替换为‘*‘

string.find()函数解析
	string.find (s, pattern [, init [, plain]])
	 s: 源字符串
	 pattern: 待搜索模式串
	 init: 可选, 起始位置,这个数字默认为1可以一个负数,表示从后往前数的字符个数
	 plain: 可选,默认为flase,传入参数true表示关闭模式匹配

	-- 这个函数如其名,用来查找匹配的pattern,返回该pattern的索引。
	-- 找到一个匹配就返回。如果找不到,返回空。
	-- 函数内部不会判断s长度是否小于pattern,使用时需要注意
使用实例,匹配屏蔽字库内字符串并转换为 ‘*’
function ChangeString(str)
	-- print(str)
	for k, v in pairs(LIMITED_MSG) do     --LIMITED_MSG屏蔽字库
		if string.len(str)>=string.len(v) then  --一定要添加长度判断,如果str长度小于v会返回非空
			if string.find (str, v, 1) then
				print(v)
				local star = showStar(v)  -- 制作一个与匹配到字符串长度一致的 '*' 字符串
				print(star)
				str = string.gsub(str, v, star)   --将 '*' 字符串替换到目标字符串中
			end
		end
	end
	-- print(str)
	GAR_str = str
end

function showStar(str)
	local len = widthSingle(str)    --计算字符串长度
	local star = ""
	for i = 1,len do
		star = star.."*"
	end
	-- print(star)
	return star
end

function widthSingle(inputstr)
    -- 计算字符串宽度
    -- 可以计算出字符宽度,用于显示使用
   local lenInByte = #inputstr
   local width = 0
   local i = 1
   while (i<=lenInByte) 
    do
        local curByte = string.byte(inputstr, i)
        local byteCount = 1;
        if curByte>0 and curByte<=127 then
            byteCount = 1                                           --1字节字符
        elseif curByte>=192 and curByte<223 then
            byteCount = 2                                           --双字节字符
        elseif curByte>=224 and curByte<239 then
            byteCount = 3                                           --汉字
        elseif curByte>=240 and curByte<=247 then
            byteCount = 4                                           --4字节字符
        end

		if curByte==46 then
			--print(333333333333333)
			return 6
		end
        local char = string.sub(inputstr, i, i+byteCount-1)
        --print(char)                                                         

        i = i + byteCount                                 -- 重置下一字节的索引
        width = width + 1                                 -- 字符的个数(长度)
    end
    return width
end
去除字符串中的符号进而检测屏蔽字
string.char()与string.byte()

string.char(…)

接收0个或者多个参数,返回一个字符串,字符串长度等于参数个数,
前提是每一参数作为ASCII码都有一个字符与之相对应,也就是说大部分的数字是无效的,
这个函数参数的ASCII码在跨平台方面不一定是可移植的。

string.byte (s [, i [, j] ])

函数返回字符s[i], s[i+1], ···, s[j]的内部数字编码(ASCII码),其中参数i的默认值是1,而参数j的默认值是i。
需要注意的是该函数在返回的数字编码在跨平台方面不一定是可移植的。
function delCode(s)
	local ss = {}
    local k = 1
    while true do
        if k > #s then break end
        local c = string.byte(s,k)
        if not c then break end
        if c<192 then
            if (c>=48 and c<=57) or (c>= 65 and c<=90) or (c>=97 and c<=122) then
                table.insert(ss, string.char(c))
            end
            k = k + 1
        elseif c<224 then
            k = k + 2
        elseif c<240 then
            if c>=228 and c<=233 then
                local c1 = string.byte(s,k+1)
                local c2 = string.byte(s,k+2)
                if c1 and c2 then
                    local a1,a2,a3,a4 = 128,191,128,191
                    if c == 228 then a1 = 184
                    elseif c == 233 then a2,a4 = 190,c1 ~= 190 and 191 or 165
                    end
                    if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then
                        table.insert(ss, string.char(c,c1,c2))
                    end
                end
            end
            k = k + 3
        elseif c<248 then
            k = k + 4
        elseif c<252 then
            k = k + 5
        elseif c<254 then
            k = k + 6
        end
    end
    return table.concat(ss)
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值