Ruby如何使用gsub仅替换内容中每个关键词的前两次匹配为超链接
Ruby关键词替换次数控制解决方案
要实现每个关键词仅替换前2次匹配,我们可以新增一个计数器哈希,记录每个关键词的已替换次数,匹配时通过计数器判断是否需要替换,修改后的代码如下:
def execute # 加载所有关键词映射,key统一转为小写 all_keys = Keyword.all.pluck(:key, :link).to_h.transform_keys(&:downcase) # 初始化计数器,默认每个关键词的初始替换次数为0 replace_counts = Hash.new(0) content = @post.swap_content.to_s # 遍历替换,使用不带!的gsub避免无匹配时返回nil的问题 @post.swap_content = content.gsub(/\w+/) do |word| lower_word = word.downcase url = all_keys[lower_word] # 仅当存在对应链接、且已替换次数小于2时执行替换 if url && replace_counts[lower_word] < 2 replace_counts[lower_word] += 1 "<a href='#{url}'>#{word}</a>" else word end end @post.save! end
实现说明
replace_counts是默认值为0的哈希,每匹配到一个可替换的关键词,就将对应计数+1- 仅当计数小于2时才生成超链接,超过2次的匹配直接返回原文本,若需要调整每个关键词的替换上限,只需修改判断条件中的数值即可
- 把原来的
gsub!改为普通gsub,避免当内容中无匹配关键词时gsub!返回nil,导致@post.swap_content被错误赋值为nil的问题 - 测试示例输入
michigan, michigan and michigan, utah and utah时,前两个michigan和前两个utah会被替换为超链接,第三个michigan保持原文本不变,完全符合需求
内容的提问来源于stack exchange,提问作者Silka
相关产品推荐
相关产品推荐

