2017-09-28 14 views
1

我使用引入nokogiri除去像這樣某個類:在引入nokogiri修改班,正則表達式

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

我不知道是否有一種方法,以消除與正則表達式定義的類。例如,如果我想刪除一個有一系列數字的類,例如/classname-\d+/,我該怎麼做?它不工作,直接插入到remove_class方法的正則表達式,我似乎無法在任何地方找到這個問題(或解決方案!)。

在一個相關的說明,將它也有可能搜索的使用正則表達式類,然後用一個新的類名稱替換那些類?

謝謝你的任何見解/幫助!

回答

4

不幸的是,用你目前的方法,我認爲你不能用現有的方法做到這一點。但是,嘿,當有意願時,有一種方法!看看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 
1
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'}