Ruby'deki HTML varlıklarını nasıl kodlayabilir / kodunu çözebilirim?


200

Ben gibi bazı HTML öğelerini, çözmeye çalışıyorum '&amp;lt;'olma '<'.

Eski bir mücevher ( html_helpers ) var ama iki kez terk edilmiş gibi görünüyor.

Herhangi bir tavsiye? Bir modelde kullanmam gerekecek.


6
Sadece 'htmlentities' bulundu ( htmlentities.rubyforge.org )
Kostas

Ben html farklı sitelerden bir grup almak ve veritabanında düz metin olarak kaydetmek gerektiğini belirtmeliyim
Kostas

1
En çok oy CGI kullanmaya giderken, yapma. Tek bir yöntem elde etmek için tüm Aktif Desteği almak gibi bir şey. Bunun yerine, seçilen yanıtta belirtildiği gibi HTMLEntities kullanın.
Teneke Adam

Yanıtlar:


154

HTMLEntities bunu yapabilir:

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"

Zdrasti Ivailo. Yorumun için teşekkürler; Üzerinde üzerinde benim sorun çözüldü ben Ruby XML karakter kodu başvuruları hale nasıl? de!
Josh Glover

4
Evet, HTMLEntitiesmücevher gibi durumlarda ilgilenir &aring;ve &mdash;hangi CGI.unescapeHTMLbuna gerek yoktur.
thomax

297

Karakterleri kodlamak için şunları kullanabilirsiniz CGI.escapeHTML:

string = CGI.escapeHTML('test "escaping" <characters>')

Onları çözmek için CGI.unescapeHTML:

CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")

Elbette, bundan önce CGI kütüphanesini eklemeniz gerekir:

require 'cgi'

Rails'deyseniz, dizeyi kodlamak için CGI kullanmanıza gerek yoktur. Orada hyöntemi.

<%= h 'escaping <html>' %>

9
Önce bu yaklaşımı denedim ama "& nbsp;" "" içine. Ben farklı sitelerden bir grup html almak ve veritabanında düz metin olarak kaydetmek gerektiğini belirtmek gerekir sanırım.
Kostas

2
HTML varlıklarını bir veritabanında depolama için düz metin olarak çözüyorsanız, veritabanınızın bozuk karakterler hakkında çok fazla şikayet etmesini bekleyin. Kodlanan varlıklar, düz metin olarak aktarılmalarına izin verecek şekilde kodlanır. Bunların kodunu çözmek, büyük olasılıkla onları üst bit set karakterlere, AKA ikilisine geri döndürür. Büyük olasılıkla, düz metin bekleyen bir DB'yi gerçekten tahriş edecek çok baytlı karakterlerle sonuçlanabilir. Hiçbir şey değişene kadar kod çözmekten daha iyi olursunuz, daha sonra her şeyi normalleştirmek için bir kez kodlayın, ardından saklayın.
Tin Man

1
Birden fazla kez kodlanmış varlıklar ile çok fazla HTML ile karşılaştım, gerçekten bir şeyler karmaşa yapıyor. Lif kabağı göz atın ; Doğru hatırlıyorsam, yıkayıcıları bunun için tasarlandı.
Tin Man

3
Veritabanımızı Unicode'u kaydetmek için ayarladık, bu yüzden hiç şikayet edeceğinden şüpheliyim. Ve lif kabağı aradığım şey değil, html etiketlerinden kurtulmak istemiyorum - yine de bu noktada değil.
Kostas

1
2015, unescapeHTML hala A akut gibi bazı varlıkları atlıyor
nurettin

47

Nokogiri mücevher de iyi bir seçim olduğunu düşünüyorum . Çok kararlı ve büyük bir katkıda bulunan topluluğa sahip.

Örnekler:

a = Nokogiri::HTML.parse "foo&nbsp;b&auml;r"    
a.text 
=> "foo bär"

veya

a = Nokogiri::HTML.parse "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"

3
@ theTinMan, evet bence talebe bağlı. Bu konudaki tartışmalarda görebileceğiniz gibi, CGI.escapeHTMLbelki bazı vakaları çözemeyiz. Öte yandan, tam bir desteğe ihtiyacınız varsa, eminim Nokogiriiyi bir seçimdir.
Hoang Le

6
Ayrıca, zaten HTML ayrıştırması için Nokogiri kullanıyorsanız, yalnızca bu amaç için başka bir mücevher yüklemek mantıksızdır. Örneğin, HTML temizlemek için Sanitize gem kullanıyorum. Görünüşe göre bu taş kaputun altında Nokogiri kullanıyor ve bu yüzden bunun avantajını almamak utanç verici olurdu. Bahşiş için @HoangLe teşekkürler!
Tomalla

1
Not: CGI::escapeHTMLäöüß gibi Almanca karakterlerden kaçmaz ve belki daha fazlası ... Nokogiri ile henüz kontrol etmedim, ama bu artı bir nokta olurdu.
Güzellik

HTMLEntities hafif ve yetenekli bir seçim olacaktır. Nokogiri'yi çok kullanıyorum ve zaten yüklü değilse, HTMLEntities ile giderdim. CGI güncel değil.
Tin Man

36

Rails'teki karakterlerin kodunu çözmek için şunu kullanın:

<%= raw '<html>' %>

Yani,

<%= raw '&lt;br&gt;' %>

çıktı

<br>

5
Bu sadece görünümde çalışır. ActiveRecord'da da çalışan bir şeye ihtiyacım var.
Kostas

3
Sadece hata ayıklayıcıda test edildi - raw '& lt br & gt' ==> '& lt br & gt'.
Tomlins

13
#rawhiçbir şeyin kodunu çözmez. Bu görünümü söyler değil dize kodlamak için. Bunu, dizeyi true olarak ayarlanmış ActiveSupport::SafeBufferbir flag ( html_safe?) içeren a'ya sararak yapar . Görünüm, dizeden kaçmadan doğrudan HTML'ye enjekte edilebileceğini belirlemek için bu bayrağı kullanır. html_safeProgramcı tarafından söz konusu dizenin zaten düzgün bir şekilde kaçıldığını gösteren bir gösterge olarak düşünmeyi seviyorum .
Moxley Stratton

9

Sadece bunu yapmak için yeni bir bağımlılık eklemek istemiyorsanız (gibi HTMLEntities) ve zaten kullanıyorsanız Hpricot, sizin için hem kaçabilir hem de manzarayı kaldırabilir. Şunlardan çok daha fazlasını yapar CGI:

Hpricot.uxs "foo&nbsp;b&auml;r"
=> "foo bär"

5
Şimdi buna bakan insanlar için not - Hpricot artık korunmuyor.
SamStephens

2
Hpricot yerine XML / HTML ayrıştırma için defacto standardı olan Nokogiri'yi kullanın .
Tin Man

0

htmlasciiGem kullanabilirsiniz :

Htmlascii.convert string

-5
<% str="<h1> Test </h1>" %>

result: &lt; h1 &gt; Test &lt; /h1 &gt;

<%= CGI.unescapeHTML(str).html_safe %>

Kullanıcı tarafından girilen herhangi bir metne html_safe ekleyerek, görünümün güvenli olmadığı mümkün olduğunda güvenli olduğunu söylediğinizi düşünüyorum. Bu, kullanıcılarınızı bu görünümü yüklediklerinde riske atar.
user1515295

Neden bu kadar olumsuz olduğunu bilmiyorum. Bu sorudaki tüm çözümleri denedim. Sadece bu iyi çalışıyor. HTML güvenli hakkında, kullanıcı HTML'yi oluşturmak istiyor, ardından HTML_SAFE doğrudur.
Diego Somar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.