Ruby, gsub и регулярное выражение
-
18-09-2019 - |
Вопрос
Краткая предыстория:У меня есть строка, содержащая ссылки на другие страницы.Страницы связаны с использованием формата:«#12».Хэш, за которым следует идентификатор страницы.
Скажем, у меня есть следующая строка:
str = 'This string links to the pages #12 and #125'
Я уже знаю идентификаторы страниц, на которые нужно связать:
page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]
Как я могу просмотреть идентификаторы страниц и связать № 12 и № 125 с соответствующими страницами?Проблема, с которой я столкнулся, заключается в том, что я делаю следующее (в рельсах):
page_ids.each do |id|
str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end
Это отлично работает для № 12, но привязывает часть «12» № 125 к странице с идентификатором 12.
Любая помощь была бы потрясающей.
Решение
если ваши индексы всегда заканчиваются на границах слов, вы можете сопоставить это:
page_ids.each do |id|
str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end
вам нужно только добавить символ границы слова \b
по шаблону поиска он не нужен для шаблона замены.
Другие советы
Вместо того, чтобы сначала извлекать идентификаторы, а затем заменять их, вы можете просто найти и заменить их за один раз:
str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }
Даже если вы не можете пропустить этап извлечения, потому что вам нужны идентификаторы где-то еще, это должно быть намного быстрее, поскольку не нужно проходить через всю строку для каждого идентификатора.
ПС:Если str
нигде больше не упоминается, вы можете использовать str.gsub!
вместо str = str.gsub