FiveM环境下Lua的:gsub/string.gsub替换指定文本失效问题求助
Lua gsub 替换不生效问题排查
核心原因
- Lua 的
string.gsub第二个参数默认是模式匹配字符串,而非普通字面量,你要匹配的内容包含多个模式特殊字符(.、(、)),未转义时无法正常匹配目标内容。 - 从你给出的运行输出可以看到,第一次打印的结果就已经没有
<script>、</script>标签,说明 FiveM 运行环境在你执行替换逻辑前,就已经自动剥离了字符串内的 HTML 脚本标签,此时变量中已经不存在你写的完整匹配片段,自然替换不生效。
解决方案
方案1:适配环境过滤规则,直接匹配剩余内容
因为环境已经提前去掉了script标签,直接匹配剩下的脚本内容即可:
b = 'Just testing.<script>window.location.replace("http://google.com");</script>' print(b) -- 直接匹配过滤后残留的脚本内容 b = b:gsub('window%.location%.replace%("http://google%.com"%)%;', "") print(b)
方案2:普通字面量替换(不需要模式匹配时用)
如果需要直接按字符串字面量完全匹配替换,可以先封装转义函数,避免手动处理特殊字符:
-- 封装字面量替换函数,自动转义所有模式特殊字符 local function literalReplace(str, oldStr, newStr) local escapedOld = oldStr:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%0") return str:gsub(escapedOld, newStr) end -- 调用示例,直接传入原始要替换的内容即可 b = literalReplace(b, 'window.location.replace("http://google.com");', "")
内容的提问来源于stack exchange,提问作者Mordexx
相关产品推荐
相关产品推荐

