ルビー、GSUBおよび正規表現
-
18-09-2019 - |
質問
のクイック背景:私は他のページへの参照を含む文字列を持っています。 「#12」:ページはフォーマットを使用してにリンクされています。ページのIDが続いたハッシュ。の
私は次の文字列があるとします:
str = 'This string links to the pages #12 and #125'
私はすでにリンク必要とするページのIDを知っています:
page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]
どうすればループページIDを通って、それぞれのページに#12と#125をリンクしますか?私は(レールに)次のことを行う場合、私はに実行した問題があります:
page_ids.each do |id|
str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end
この#12のために正常に動作しますが、それは12のIDとページに#125の「12」の部分をリンクします。
すべてのヘルプは素晴らしいだろう。
解決
あなたのインデックスは常にワード境界で終了した場合、あなたはそれを一致させることができます:
page_ids.each do |id|
str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end
あなただけの検索パターンにワード境界シンボル\b
を追加する必要があり、それは置換パターンのために必要ではありません。
他のヒント
代わりに、最初のIDを抽出し、それらを置き換えるのでは
、あなたは、単に一度にそれらを見つけると置き換えることができます:
str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }
あなたにもどこかのIDを必要とするので、あなたが抽出工程を省略することができない場合であっても、それは各idの文字列全体を通過する必要がないので、これは、はるかに高速である必要があります。
PS:str
が他のどこからも参照されていない場合は、代わりにstr.gsub!
のstr = str.gsub
を使用することができます。
所属していません StackOverflow