回答編集履歴

2

タグが1つであることを前提としている旨を追記

2015/02/24 13:59

投稿

riocampos
riocampos

スコア241

test CHANGED
@@ -40,6 +40,8 @@
40
40
 
41
41
  nokogiri でのパース方法を追記します。
42
42
 
43
+ タグが一つだけであることを前提としています(修正すれば複数タグでも扱えますので、必要があればやってみてください)。
44
+
43
45
 
44
46
 
45
47
  ```lang-ruby

1

nokogiri でのパース方法を追記

2015/02/24 13:59

投稿

riocampos
riocampos

スコア241

test CHANGED
@@ -33,3 +33,43 @@
33
33
  もちろん、前提条件がお示しのタグぐらい統一されていて簡略であれば簡単ですけどね。
34
34
 
35
35
  (もしも、対象となるタグの前提条件が明確になっているならば、それに合わせた程度で書くこともできますので、ご連絡ください。ただし、結果として正規表現が面倒になりそうであれば、その旨ご返答します。)
36
+
37
+
38
+
39
+ ---
40
+
41
+ nokogiri でのパース方法を追記します。
42
+
43
+
44
+
45
+ ```lang-ruby
46
+
47
+ ng_words = %w[ngword-1 ngword-2]
48
+
49
+ str = %[<div class="XXX ngword-1 ngword-2"></div>]
50
+
51
+
52
+
53
+ elem = Nokogiri::HTML.parse(str).xpath('/html/body/*').first
54
+
55
+ classes = elem[:class].split
56
+
57
+ classes -= ng_words
58
+
59
+ elem[:class] = classes.join(" ")
60
+
61
+ tag = elem.to_html
62
+
63
+ puts tag #=> <div class="XXX"></div>
64
+
65
+ ```
66
+
67
+
68
+
69
+ NG ワードは配列に入れておきます。
70
+
71
+ タグは `Nokogiri::HTML.parse` すると html タグと body タグにラップされるので、 `xpath('/html/body/*')` メソッドでラップを剥がして目的とするタグのみを含むインスタンス elem を抜き出します(div タグに限らず、どのようなタグでも使えるように書いています)。
72
+
73
+ 続いて class 属性値を抜き出して文字列そして配列にし、 NG ワードを取り除いてから文字列に戻し、再度 class 属性値に設定しています。
74
+
75
+ あとは `to_html` メソッドで戻せばいいだけです。