回答編集履歴
2
タグが1つであることを前提としている旨を追記
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 でのパース方法を追記
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` メソッドで戻せばいいだけです。
|