有没有办法检查 Rails 中的文本字符串是否有效 HTML?

Is there a way to check if text string is valid HTML in Rails?

我正在 Rails 4 中编写一个简单的 CMS。我将我的文章作为包含 HTML 代码(不需要)的文本字符串存储在数据库中。

无论如何,我需要一种方法来在保存之前检查文章的文本是否有效HTML或也不正确(考虑到文章不是完整的HTML文档,而是部分它,没有 DOCTYPE 和其他东西)。像这样:https://validator.w3.org/#validate_by_input+with_options ("Validate HTML fragment"),但是在我的 Rails 应用程序中作为模型的验证方法工作,所以如果我的标记是错误的,它不应该保存文章并显示而是错误消息。

有gem或其他方法吗?

如果您要检查 rails 中某个字段的输入,您可以简单地利用 3 个东西,它们是

  1. Railsbefore_save回调
  2. JS/Ajax 用于检查输入(避免页面重新加载)
  3. 您定义为有效的约束条件HTML

在您的模型中,您可以创建一个方法来检查插入到字段中的文本是否有效。在保存表单之前,它会检查插入的 html 是否符合您对有效 html 的定义。

希望以上内容对您有所帮助。

所以我想出了如何使用 w3c_validators gem 来实现这一点。

  1. gem 'w3c_validators' 添加到 Gemfile 和 运行 bundle install
  2. 更换型号。我添加了自定义验证方法来验证 HTML,如下所示:

    class Article < ActiveRecord::Base
        validate :valid_html
    
        def valid_html
          @validator = MarkupValidator.new
    
          html = "<!DOCTYPE html><html><head><title>title</title></head><body>#{text}</body></html>"
    
          results = @validator.validate_text(html)
    
          if results.errors.length > 0
            results.errors.each do |err|
              errors.add(:text, err.to_s)
            end
          end
        end
      end
    

(我需要将我的代码包装到 HTML 和 BODY 标签中并添加更多标签,因为我没有在我的数据库中存储完整的 HTML,只有部分)。