Как решить следующую проблему?Ruby заменяет только точную строку соответствия другой строкой
У меня есть HTML строку как следующий:
<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>
Теперь я хотел бы заменить, например, только
"aaa"
с
"<div class='special'>aaa</div>"
новую строку после замены:
<p><div class='special'>aaa</div>, b aa aaaaa?<br/>Next possible text b bb aa b.</p>
Итак, я хотел бы использовать общий заменитель, который заменяет только точную строку соответствия. «aaa» был всего лишь примером. Это может быть также «bb» или «two words» (=> два слова, поэтому text.split не будет работать, на мой взгляд).
У кого-нибудь есть идея для такой динамичной находки, соответствия и замены?
Я попробовал это уже, как следующее:
items = ["aaa", "a", "aa", "aa b", "c"]
text = "<p>aaa, b aa aaaaa?<br/>Next possible text b bb aa b.</p>"
words = text.split => ["<p>aaa,", "b", "aa", "aaaaa?<br/>Next", "possible", "text", "b", "bb", "aa", "b.</p>"]
new_words = []
words.each do |w|
items.each do |item|
if w == item
w = '<div class="special">#{item}</div>'
end
end
new_words << w
end
text = new_words.join(" ")
Результат:
"<p>aaa, b <div class='special'>aa</div> aaaaa?<br/>Next possible text b bb <div class='special'>aa</div> b.</p>"
Но это должно быть:
"<p><div class='special'>aaa</div>, b <div class='special'>aa</div> aaaaa?<br/>Next possible text b bb <div class='special'>aa b</div>.</p>"
моих самых больших проблем являются:
- специальные символы, такие как «?()% €» -характеры в конце строки => „ааа“, из примера
- подстрок с теми же частями => как „ааа“ и „аа“
- Два слова, как один пункт => как «аа Ь» из примера
Кто-то идея для фиксации мои проблемы?
EDIT: что-то только заполнитель для моей замены .. моя реальная замена также может быть:
%Q(<dfn title="#{strip_tags item.text}">#{item.name}</dfn>)
item.text может быть все => может содержать также «ааа» item.name для пример «aaa»
Таким образом, множественный gsub заменит также уже замененное содержимое.
Это должно быть 'sub' not' gsub', поскольку OP хочет только первое совпадение и не указывает, что он всегда будет рядом с тегом. – iain