【问题标题】:modifying classes in nokogiri with regex使用正则表达式修改 nokogiri 中的类
【发布时间】:2017-09-29 12:46:44
【问题描述】:

我正在使用 nokogiri 删除某些类,如下所示:

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

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

在相关说明中,是否也可以使用正则表达式搜索类,然后用一个新的类名替换这些类?

感谢您的任何见解/帮助!

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

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

      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

    方法可以这样打补丁:

    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
    

    【讨论】:

      【解决方案2】:
      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'}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多