需要从 URL 中删除特定参数

我刚接触 Lua 库,现在有一个需求,需要从特定参数中删除它及其值: 例如:

字符串 1:?xyz=true&toekn=4234dadsasda

字符串 2:?toekn=4234dadsasda&test=pass

需要在删除令牌及其值后得到以下输出

字符串 1:?xyz=true

字符串 2:?test=pass

我尝试了下面的 Lua gsub 函数,但没有成功:

string.gsub(args,"token=.*"," ")

感谢任何帮助。

点赞
用户3832970
用户3832970

如果您只能使用两个查询参数且不超过您的输入中所示的两个,则可以使用以下代码:

text:gsub("&?token=[^&]+&?", "")

或者,如果您有多个查询参数,则可以使用以下代码:

text:gsub("([&?])token=[^&]+&?", "%1"):gsub("(.*)&$", "%1")

请参见在线Lua演示#1在线Lua演示#2

细节:

  • &? - 可选的 &
  • token= - 一个文字字符串
  • [^&]+ - 一个或多个字符,不包括 &
  • &? - 可选的 & 字符。

在第二种情况下,:gsub("([&?])token=[^&]+&?", "%1")将匹配的部分替换为 token 之前的 ?&,而下一个 gsub("(.*)&$", "%1") 则在参数出现在字符串末尾时删除字符串末尾的 &

2021-02-22 22:43:39
用户1442917
用户1442917

你可能还需要考虑其他条件(使用 &; 作为分隔符[1]),以及一些特殊情况(结尾有分隔符和包含 token 子串的情况):

text:gsub("([&;]?)%f[%a]token=[^&;]+([&;]?)",
  function(s1, s2) return s1 and s2 and #(s1..s2) > 1 and s1 or "" end)

这个解决方案能够正确处理包含 subtoken 参数和使用 ; 作为分隔符的查询字符串。该模板使用了 %f[%a],这是一个 frontier pattern,表示非字母到字母的空字符串边界(包括字符串的第一个字符)。

[1] W3C 建议所有 Web 服务器支持使用分号分隔符,以允许在 HTML 文档中的 URL 的 application/x-www-form-urlencoded 查询字符串中使用 ampersand 分隔符,而无需对 ampersands 进行实体转义(查询字符串的 wikipedia 文章)。

2021-02-23 06:11:22