teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

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

2015/02/24 13:59

投稿

riocampos
riocampos

スコア241

answer CHANGED
@@ -19,6 +19,7 @@
19
19
 
20
20
  ---
21
21
  nokogiri でのパース方法を追記します。
22
+ タグが一つだけであることを前提としています(修正すれば複数タグでも扱えますので、必要があればやってみてください)。
22
23
 
23
24
  ```lang-ruby
24
25
  ng_words = %w[ngword-1 ngword-2]

1

nokogiri でのパース方法を追記

2015/02/24 13:59

投稿

riocampos
riocampos

スコア241

answer CHANGED
@@ -15,4 +15,24 @@
15
15
 
16
16
  結論としては「書けますが面倒」です。 nokogiri などの HTML/XML パーサを使ってください。
17
17
  もちろん、前提条件がお示しのタグぐらい統一されていて簡略であれば簡単ですけどね。
18
- (もしも、対象となるタグの前提条件が明確になっているならば、それに合わせた程度で書くこともできますので、ご連絡ください。ただし、結果として正規表現が面倒になりそうであれば、その旨ご返答します。)
18
+ (もしも、対象となるタグの前提条件が明確になっているならば、それに合わせた程度で書くこともできますので、ご連絡ください。ただし、結果として正規表現が面倒になりそうであれば、その旨ご返答します。)
19
+
20
+ ---
21
+ nokogiri でのパース方法を追記します。
22
+
23
+ ```lang-ruby
24
+ ng_words = %w[ngword-1 ngword-2]
25
+ str = %[<div class="XXX ngword-1 ngword-2"></div>]
26
+
27
+ elem = Nokogiri::HTML.parse(str).xpath('/html/body/*').first
28
+ classes = elem[:class].split
29
+ classes -= ng_words
30
+ elem[:class] = classes.join(" ")
31
+ tag = elem.to_html
32
+ puts tag #=> <div class="XXX"></div>
33
+ ```
34
+
35
+ NG ワードは配列に入れておきます。
36
+ タグは `Nokogiri::HTML.parse` すると html タグと body タグにラップされるので、 `xpath('/html/body/*')` メソッドでラップを剥がして目的とするタグのみを含むインスタンス elem を抜き出します(div タグに限らず、どのようなタグでも使えるように書いています)。
37
+ 続いて class 属性値を抜き出して文字列そして配列にし、 NG ワードを取り除いてから文字列に戻し、再度 class 属性値に設定しています。
38
+ あとは `to_html` メソッドで戻せばいいだけです。