Один из способов сделать это, предполагая, что вы хотите связать только целые слова:
html = "<p>ruby, rails, php, python, django and sinatra</p>"
word_links = { "ruby" => "http://www.ruby-lang.org",
"python" => "http://www.python.org" }
html.gsub(/\w+/) do |word|
word_links[word] ? "<a href=\"#{word_links[word]}\">#{word}</a>" : word
end
Если текст, над которым вы работаете, довольно велик, но список слов, которые вы хотите связать, довольно мал, это можно немного оптимизировать, выполнив подстановку только для подходящих слов:
html.gsub(/\b(#{word_links.keys.join('|')})\b/,
"<a href=\"#{word_links[$1]}\">#{$1}</a>")
Просто убедитесь, что у вас нет ключевых слов, которые могут появляться внутри открывающего тега (например, внутри значения атрибута, которое полностью нарушит это решение.) Для действительно надежного решения вам придется использовать правильное HTML парсер и просто замени текст контента.