You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中不改变原字符大小写实现关键词替换为超链接的方法

解决方案

你的问题根源是直接将原文整体转为小写后再执行替换,自然会丢失原有文本的大小写格式。你不需要手动对比大小写转换前后的内容,直接使用Rubygsub方法的不区分大小写匹配模式即可实现匹配时忽略大小写、替换时保留原始文本格式的需求。

优化后代码

def execute
  @post = Post.find(params[:post_id])
  # 构造小写关键词到对应链接的映射表
  keyword_mapping = Keyword.all.pluck(:key, :link).to_h.transform_keys(&:downcase)
  new_content = @post.content.to_s.dup

  keyword_mapping.each do |lower_key, target_link|
    # 构造不区分大小写的正则,\b为单词边界标记,避免部分匹配,不需要可删除
    match_regex = Regexp.new("\\b#{Regexp.escape(lower_key)}\\b", Regexp::IGNORECASE)
    new_content.gsub!(match_regex) do |original_matched_text|
      # original_matched_text 就是原文中匹配到的、保留原有大小写的内容
      "<a href='#{ERB::Util.html_escape(target_link)}'>#{ERB::Util.html_escape(original_matched_text)}</a>"
    end
  end

  @post.update!(content: new_content)
end

补充说明

  • 代码中加入Regexp.escape是为了转义关键词中的正则特殊字符(如.、*、?等),避免匹配逻辑异常
  • 加入ERB::Util.html_escape是为了规避XSS安全风险,同时防止链接、关键词中的特殊字符破坏HTML结构,生产环境建议务必保留
  • 如果你不需要严格匹配完整单词(比如不需要避免关键词he匹配到hello中的he),删除正则中的\\b标记即可

内容的提问来源于stack exchange,提问作者Silka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:27:03