Ruby字符串按哈希关键词替换加超链接bug修复及跳过已有超链接咨询
解决方案
基础逻辑修复(解决非关键词误加超链接问题)
你代码的问题是单词不匹配哈希表时得到的key为nil,你依然把nil作为键计入出现次数,同时执行了超链接包裹逻辑,所以前两个不匹配的单词也会被错误加上空href的a标签。
修复时只需增加判断,只有匹配到哈希表中存在的关键词时才进入计数和替换流程,不匹配的直接返回原字符串即可:
occurrences = {} my_string.gsub!(/\w+/) do |match| key = my_hash[match.downcase] # 非关键词直接返回原内容,不参与计数 next match unless key count = occurrences.store(key, occurrences.fetch(key, 0).next) count > 2 ? match : %(<a href="#{key}">#{match}</a>) end
运行后即可得到你期望的输出,且仅对哈希表内的关键词生效,前2次匹配转换为超链接,第3次及以上保留原内容。
跳过已有超链接的实现方案
如果要避免修改字符串中已经存在的a标签内容,可以修改正则规则,优先匹配完整的a标签块直接返回,再处理剩余的普通单词:
occurrences = {} # 正则优先捕获完整的a标签结构 my_string.gsub!(/(<a\b[^>]*>.*?<\/a>)|\w+/i) do |match| # 匹配到a标签直接返回,不处理内部内容 next match if $1 key = my_hash[match.downcase] next match unless key count = occurrences.store(key, occurrences.fetch(key, 0).next) count > 2 ? match : %(<a href="#{key}">#{match}</a>) end
该逻辑会自动跳过所有已经存在的<a>标签内部的文字,不会修改原有超链接的内容和指向。
内容的提问来源于stack exchange,提问作者RealOne0912
相关产品推荐
相关产品推荐

