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
相关产品推荐
相关产品推荐

