2010-12-04 7 views

Respuesta

14

creo que esto debería ser suficiente:

"<b>lol</b>".gsub(/<[^>]*>/ui,'') #=> lol 

Usted puede utilizar Nokogiri así:

require 'rubygems' 
require 'nokogiri' 
doc = Nokogiri::HTML("<b>lol</b>") 
doc.text #=> "lol" 

Todavía puedes ir con los Rails haciendo algo lik e:

require 'rubygems' 
require 'action_view' 

class Foo 
    include ActionView::Helpers::SanitizeHelper 

    def test 
    strip_tags("<b>lol</b>") 
    end 
end 

f = Foo.new 
puts f.test #=> lol 
+1

Nunca se sabe lo que harán los navegadores si solo pone un soporte de apertura sin cerrarlo alguna vez; Definitivamente no asumiría que la solución 'gsub' es segura a menos que pones un' .gsub (/ [<>] /, '') 'extra al final. (Y aun así no lo responderé). –

+2

+1 para el comentario de Nokogiri. Eso funciona perfectamente para mis necesidades. –

+1

Nokogiri es la herramienta adecuada para el trabajo. – superluminary

-2

Lo ideal sería que se requieren e incluyen ActionView::Helpers::SanitizeHelper pero hay varias dependencias que no se deje incluidos cuando se hace eso. Puede requerirlos usted mismo para poder usar strip_tags.

require 'erb' 
require 'active_support' 
require 'active_support/core_ext/class/attribute_accessors' 
require 'active_support/core_ext/string/encoding' 
require 'action_view/helpers/capture_helper' 
require 'action_view/helpers/sanitize_helper' 

include ActionView::Helpers::SanitizeHelper 

strip_tags("<b>lol</b>") # => "lol" 

Esto es suponiendo que tiene barandillas 3 gemas instaladas.

+0

ActionView no es compatible con Cherry Picking requiere, es por eso que este enfoque termina siendo tan bruto. Ver mi respuesta para más detalles. – John

28

La pregunta es bastante antigua, pero tuve el mismo problema recientemente. Encontré una solución simple: gem sanitize. Es ligero, funciona bien y tiene opciones adicionales si los necesita.

Sanitize.clean("<b>lol</b>") #=> "lol" 
24

ActiveSupport es el único bastidor de Rails que admite los componentes individuales de recolección de cerezas. Los otros marcos, incluyendo ActionView, deben ser requeridos en masa:

require 'action_view' 

Tenga en cuenta que este requiere no necesariamente va a cargar todos ActionView. Salvo en situaciones en las que la seguridad de las hebras requiere que las autocargadas sucedan con entusiasmo, simplemente configura las autocarga y requiere dependencias comunes. Eso significa que si sigue los requisitos, si hace referencia, p. ActionView::Helpers::SanitizeHelper, provocará que se requiera action_view/helpers /sanitize_helper.rb.

Por lo tanto la forma correcta, con el apoyo para lograr lo que deseo usando ActionView es la siguiente:

require 'action_view' 

class Test < Test::Unit::TestCase # or whatever 
    include ActionView::Helpers::SanitizeHelper 

    def my_test 
    assert_equal "lol", strip_tags("<b>lol</b>") 
    end 
end 

Esto no está bien documentada; Basé esta respuesta principalmente en the discussion on this issue.

+0

¿Necesita explícitamente requerir action_view? ¿En qué versión de Rails? No recuerdo haber necesitado al menos para Rails 2.3.x – tokland

+1

La pregunta es sobre el uso de strip_tags _outside_ de Rails, por lo que, sí, es necesario que lo incluya. – John

+0

oh, ya veo, de hecho el OP no dice que esté usando Rails. – tokland

-1
HTML::FullSanitizer.new.sanitize('<b>lol</b>') # => "lol" 
8

Si no se utiliza muy a menudo, a continuación, puede utilizar:

ActionView::Base.full_sanitizer.sanitize(your_html_string) 

cosa que se pueda definir un método en el test_helper.rb archivo como:

def strip_html_tags(string) 
    ActionView::Base.full_sanitizer.sanitize(string) 
end 

Y luego en tu prueba.archivo rb, utilice esto como:

strip_html_tags(your_html_string) 
0

Con este ejemplo:

"&lt;p&gt;<i>example</i>&lt;/p&gt;" 

Esto me ayudó:

ActionView::Base.full_sanitizer.sanitize(Nokogiri::HTML(example).text) 

Salida:

example 
2

La pregunta es bastante antiguo , pero puedes llamarlo en tu test.rb li ke this:

ActionController::Base.helpers.strip_tags("<b>lol</b>") => "lol" 
Cuestiones relacionadas