Ruby, gsub e regex
-
18-09-2019 - |
Domanda
sfondo rapida: Ho una stringa che contiene riferimenti ad altre pagine. Le pagine sono collegate al utilizzando il formato: "# 12". Un hash seguito dal ID della pagina.
Dire che ho la seguente stringa:
str = 'This string links to the pages #12 and #125'
So già gli ID delle pagine che necessitano di collegamento:
page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]
Come faccio a ciclo attraverso gli ID di pagina e collegare il # 12 e # 125 alle rispettive pagine? Il problema che ho incontrato è che se faccio la seguente (in rotaie):
page_ids.each do |id|
str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end
Questo funziona bene per la # 12, ma si collega la parte "12" di # 125 alla pagina con ID di 12.
Qualsiasi aiuto sarebbe impressionante.
Soluzione
se gli indici terminano sempre ai confini di parola, è possibile abbinare che:
page_ids.each do |id|
str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end
è sufficiente aggiungere il simbolo confine di parola \b
sul modello di ricerca, non è necessario per il modello di sostituzione.
Altri suggerimenti
Invece di estrarre gli ID e poi la loro sostituzione, si possono trovare in modo semplice e sostituirli in un colpo solo:
str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }
Anche se non si può tralasciare la fase di estrazione perché è necessario gli ID da qualche altra parte, così, questo dovrebbe essere molto più veloce, dal momento che non ha bisogno di passare attraverso l'intera stringa per ogni ID.
PS: Se str
non è contemplata da qualsiasi altro luogo, è possibile utilizzare al posto di str.gsub!
str = str.gsub