Как я могу использовать strip_tags в обычном коде Ruby (не рельсы)? - PullRequest
23 голосов
/ 04 декабря 2010

Мне нужно превратить HTML в простой текст. Есть хорошая функция, которая делает это в SanitizeHelper в ActionView, но мне сложно понять, как я могу ссылаться на нее и использовать ее в простом файле test.rb.

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

Я бы хотел позвонить strip_tags("<b>lol</b>") => "lol"

Ответы [ 8 ]

31 голосов
/ 21 апреля 2011

Вопрос довольно старый, но у меня недавно была такая же проблема.Я нашел простое решение: gem sanitize .Он легкий, отлично работает и имеет дополнительные опции, если они вам нужны.

Sanitize.clean("<b>lol</b>") #=> "lol"
25 голосов
/ 29 декабря 2011

ActiveSupport - единственная платформа Rails, которая поддерживает выбор отдельных компонентов. Другие платформы, в том числе ActionView, должны быть в массовом порядке:

require 'action_view'

Обратите внимание, что для этого не обязательно загружать все ActionView. За исключением ситуаций, когда потокобезопасность требует, чтобы автозагрузка происходила с нетерпением, она просто устанавливает автозагрузку и требует общих зависимостей. Это означает, что следуя требованию, если вы ссылаетесь, например, ActionView::Helpers::SanitizeHelper, это приведет к необходимости action_view/helpers /sanitize_helper.rb.

Поэтому правильный поддерживаемый способ выполнить то, что вы хотите с помощью ActionView, следующий:

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

Это плохо документировано; Я основал этот ответ главным образом на обсуждении этого вопроса .

.
14 голосов
/ 04 декабря 2010

Я считаю, что этого должно быть достаточно:

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

Вы также можете использовать Nokogiri:

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

Вы все еще можете пойти с Rails, выполнив что-то вроде:

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
11 голосов
/ 23 апреля 2014

Если вы используете его не очень часто, вы можете использовать:

ActionView::Base.full_sanitizer.sanitize(your_html_string)

, иначе вы можете определить метод в файле test_helper.rb, например:

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

Изатем в файле test.rb используйте это как:

strip_html_tags(your_html_string)
3 голосов
/ 13 апреля 2016

Вопрос довольно старый, но вы можете назвать его в своем test.rb так:

ActionController::Base.helpers.strip_tags("<b>lol</b>") => "lol"
0 голосов
/ 08 апреля 2016

В этом примере:

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

Это помогло мне:

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

Выход:

example
0 голосов
/ 27 марта 2014
HTML::FullSanitizer.new.sanitize('<b>lol</b>') # => "lol"
0 голосов
/ 30 декабря 2010

В идеале вам потребуется и включить ActionView::Helpers::SanitizeHelper, но есть несколько зависимостей, которые не включаются при этом.Вы можете потребовать их сами, чтобы иметь возможность использовать 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"

Предполагается, что у вас установлены рельсы с 3 драгоценными камнями.

...