Ruby, gsub e regex
-
18-09-2019 - |
Pergunta
Fundo rápido: Eu tenho uma string que contém referências a outras páginas. As páginas estão ligadas ao uso do formato: "# 12". Um hash seguido do ID da página.
Say Eu tenho a seguinte string:
str = 'This string links to the pages #12 and #125'
Eu já sei os IDs das páginas que precisam de ligação:
page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]
Como posso percorrer os ids página e vincular o # 12 e # 125 para suas respectivas páginas? O problema que eu tenho que correr para é se eu faço o seguinte (em rails):
page_ids.each do |id|
str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end
Esta multa trabalha para # 12, mas que liga a parte "12" de # 125 para a página com ID de 12.
Qualquer ajuda seria fantástico.
Solução
Se seus índices sempre terminar em limites de palavra, você pode combinar que:
page_ids.each do |id|
str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end
você só precisa adicionar o limite de palavra símbolo \b
no padrão de pesquisa, não é necessário para o padrão de substituição.
Outras dicas
Em vez de extrair os ids em primeiro lugar e, em seguida, substituí-los, você pode simplesmente encontrar e substituí-los de uma só vez:
str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }
Mesmo que você não pode deixar de fora a etapa de extração, porque você precisa os ids em outro lugar, bem, isso deve ser muito mais rápido, uma vez que não tem que passar por toda a cadeia para cada id.
PS: Se str
não é referido em qualquer outro lugar, você pode usar str.gsub!
vez de str = str.gsub