2012-03-29 12 views
6

sanitize() w ApplicationHelper nie zamyka znaczników.Sanitize HTML i zamykanie niekompletnych tagów

s = "<a href='http://example.com'>incomplete" 
sanitize(s, :tags => ['a', 'p']) 

Powyższy fragment kodu pozostawia niezmieniony ciąg znaków. Jak mogę zmusić go do dołączenia zamknięcia </a> lub przynajmniej całkowicie usunąć <a>?

Odpowiedz

2

Zaktualizowana odpowiedź jest

html = "<a href='http://example.com'>incomplete" 
html = sanitize(s, tags: %w[a p]) 
Nokogiri::HTML::DocumentFragment.parse(html).to_html 
+0

Ostatni wiersz sam w sobie zadziałał dobrze i zamknął również niezamknięte znaczniki. –

5

Do tego celu można użyć odpowiedniego parsera HTML. Polecam Nokogiri do pracy:

require 'nokogiri' 
# ... 
s = "<a href='http://example.com'>incomplete" 
Nokogiri::HTML::fragment(sanitize(s, :tags => ['a', 'p'])).to_xml 
# => "<a href=\"http://example.com\">incomplete</a>" 

To zawsze zwróci poprawny XML. Oczywiście możesz spakować to do swojej własnej metody pomocniczej, aby ułatwić jej użycie.

Powiązane problemy