我有以下字符串的锚(我想要更改href的内容)和一个替换的lua表,它告诉应该替换哪个单词:
s1 = '<a href="word1"></a><a href="word2"></a><a href="word3"></a><a href="word1"></a><a href="word5"></a><a href="word2"></a><a href="word3"><a href="word7"></a>'
replacementTable = {}
replacementTable["word1"] = "potato1"
replacementTable["word2"] = "potato2"
replacementTable["word3"] = "potato3"
replacementTable["word4"] = "potato4"
replacementTable["word5"] = "potato5"
预期结果应为:
<a href="potato1"></a><a href="potato2"></a><a href="potato3"></a><a href="potato1"></a><a href="potato5"></a><a href="potato2"></a><a href="potato3"><a href="word7"></a>
我知道我可以为 replacementTable 中的每个元素进行迭代并每次处理字符串,但我的直觉告诉我,如果字符串非常大和/或替换表变得很大,这个apporach将表现不佳。
所以我觉得最好能做到以下几点:应用正则表达式查找所有匹配项,获取每个匹配项的迭代器,并在replacementTable中替换每个匹配项的值。
像这样的东西会很棒(用Javascript编写,因为我还不知道如何在Lua中编写lambdas):
var newString = patternReplacement(s1, '<a[^>]* href="([^"]*)"', function(match) { return replacementTable[match] })
第一个参数是字符串,第二个参数是正则表达式,第三个参数是为每个匹配项执行的替换函数。这样我认为s1会被解析一次,效率更高。
在Lua有没有办法做到这一点?
答案 0 :(得分:2)
在您的示例中,这个简单的代码有效:
print((s1:gsub("%w+",replacementTable)))
关键是gsub
已经接受了替换表。
答案 1 :(得分:0)
最后,对我有用的解决方案如下:
local updatedBody = string.gsub(body, '(<a[^>]* href=")(/[^"%?]*)([^"]*")', function(leftSide, url, rightSide)
local replacedUrl = url
if (urlsToReplace[url]) then replacedUrl = urlsToReplace[url] end
return leftSide .. replacedUrl .. rightSide
end)
它保留了任何querystring参数,只给我一个URI。我知道用正则表达式解析HTML主体是个坏主意但是对于我的情况,我需要很多性能,这样做的速度要快得多,而且只是完成了工作。