使用正则表达式修改 nokogiri 中的 类

modifying classes in nokogiri with regex

我正在使用 nokogiri 删除某些 classes:

doc.css("span").remove_class("classname-1")

我想知道是否有办法删除使用正则表达式定义的 classes。例如,如果我想删除一个 class 后面有任何数字系列,比如 /classname-\d+/,我该怎么做?直接将正则表达式插入 remove_class 方法是行不通的,而且我似乎无法在任何地方找到这个问题(或解决方案!)。

在相关说明中,是否也可以使用正则表达式搜索 寻找 class,然后将那些 class 替换为单个新 class 名称?

感谢您的任何 insight/help!

不幸的是,根据您当前的方法,我认为您无法使用现有方法做到这一点。但是,嘿,有志者事竟成!看看 remove_class source :

  def remove_class name = nil
    each do |el|
      if name
        classes = el['class'].to_s.split(/\s+/)
        if classes.empty?
          el.delete 'class'
        else
          el['class'] = (classes - [name]).uniq.join " "
        end
      else
        el.delete "class"
      end
    end
    self
  end

您能想到如何让它适用于您的用例吗?上面的方法基本上遍历从 doc.css('span') 获取的 NodeSet 中的每个 element,它获取每个元素的 class 并查看它是否匹配,如果匹配,它去掉了 class

方法可以这样打补丁:

module Nokogiri
  module XML
    class NodeSet
      def remove_class name = nil
        name = name.is_a?(String) ? Regexp.new("^#{name}$") : name
        each do |el|
          if name
            classes = el['class'].to_s.split(/\s+/)
            if classes.empty?
              el.delete 'class'
            else
              el['class'] = classes.reject{ |c| c.match name }.uniq.join " "
            end
          else
            el.delete "class"
          end
        end
        self
      end
    end
  end
end


doc.css('span').remove_class(/classname-1/) #=> Equivalent nodeset
doc.css('span[class^="classname-"]').each{|el| el.delete 'class'}

可能已经足够好了,但如果 nbot 可能:

doc.css('span').select{|el| el[:class][/classname-\d/]}.each{|el| el.delete 'class'}