ruby-on-rails
  • ruby
  • regex
  • gsub
  • 2009-08-17 25 views 9 likes 
    9

    Hızlı arkaplan: Diğer sayfalara başvurular içeren bir dizgim var. Sayfalar şu format kullanılarak bağlanmıştır: "# 12". Bir hash sayfanın kimliğini takip etti.Ruby, gsub ve düzenli ifade

    str = 'This string links to the pages #12 and #125' 
    

    Zaten bağlama ihtiyacı sayfaların kimlikleri biliyorum::

    page_ids = str.scan(/#(\d*)/).flatten 
    => [12, 125] 
    

    Nasıl sayfa kimlikleri ile ben döngü ve # bağlamak

    Ben aşağıdaki dizeyi var ki İlgili sayfalara 12 ve 125 numaralı? Ben (raylar cinsinden) aşağıdaki yaparsanız ben karşılaştık sorun şu: Bu # 12 için çalışıyor ama 12 kimliğine sahip sayfaya # 125 "12" bölümünü bağlayan

    page_ids.each do |id| 
        str = str.gsub(/##{id}/, link_to("##{id}", page_path(id)) 
    end 
    

    .

    Herhangi bir yardım harika olurdu. indekslerinizin hep sözcük sınırları sona eğer

    cevap

    12

    , bunu eşleşebilir:

    page_ids.each do |id| 
        str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id)) 
    end 
    

    yalnızca arama desen üzerinde kelime kenar simgesi \b eklemek gerekiyor, bu yedek modeli için gerekli değildir.

    +0

    ait kullanabilirsiniz. Bilmedim. Siz efendim, hayat kurtarıcıyız. –

    21

    yerine ilk kimlikleri ayıklanması ve daha sonra bunları değiştirmenin, sadece bulabilir ve tek seferde bunların yerine: Eğer bir yere kimlikleri gerekir çünkü sen çıkarma adımı terk edemez bile

    str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) } 
    

    başka bir şey de olsa, bu daha hızlı olmalı, çünkü her bir kimlik için tüm dizgiden geçmesi gerekmiyor.

    PS: str başka yerden sevk değilse, sen str.gsub! yerine Harikulade str = str.gsub

    +2

    Bu doğru çözümdür. – Magnar

    +1

    Bu etkilidir, ancak metnin içeriğine bağlı olarak yanlış pozitif sonuçlar verebilir. Referans için 125 sayfa olduğunu ve sayfaların metninde (sipariş numaraları, vb.) # 112325 gibi dizeler olduğunu düşünün. Bu, her yanlış pozitif durumunda ölü bir sayfaya bir bağlantı oluşturacaktır. Sayfalar ve kelime sınırları listesi kullanılarak yapılan aramalar kusursuz değildir, zarafetine rağmen bu çözümden daha sağlamdır. – Pinochle

    +2

    # 112325 gibi bir dize varsa, page_ids dizisinde olurdu, bu yüzden her iki durumda da bir ölü bağlantı üretecekti. Gsub'umun OP taramasıyla aynı ifadeyi kullandığını unutmayın. Böylece aynı kimlikleri bulacaklar. – sepp2k

    İlgili konular