###前提・実現したいこと
条件に一致するタグのCSSを変更したいと考えています。
- 変更元のHTMLは、テキストデータでメモリ上に保持しています。
- css要素の位置はタグの中で自由ですし、存在しない場合もあります。(下記サンプルデータ参照)
例えば『<h2>タグのうち、title要素の値が「1-」で始まるもののclass要素の値を"test2"にしたい』場合
↓次のようなデータを
php
1$test = <<<EOT 2<h2 title="0-1">aaa</h2> 3 <p>test</p> 4<h2 title="1-1" class="test">bbb</h2> 5<h2 title="1-2" class="test" aa="">ccc</h2> 6<h2 class="test" title="1-3">ddd</h2> 7<h2 class = "test" aa="" title="1-4">eee</h2> 8<h2 title="2-1">fff</h2> 9EOT;
↓このように置換したいです。
php
1$test = <<<EOT 2<h2 title="0-1">aaa</h2> 3 <p>test</p> 4<h2 title="1-1" class="test2">bbb</h2> 5<h2 title="1-2" aa="" class="test2">ccc</h2> 6<h2 title="1-3" class="test2">ddd</h2> 7<h2 aa="" title="1-4" class="test2">eee</h2> 8<h2 title="2-1">fff</h2> 9EOT; 10/* 111,2,6行目は条件に一致しないので変更無し 123,5行目は値の変更(削除して追加でも可) 134行目は追加 14*/
###試したこと
preg_replaceで強引に処理しようと試みましたが、(私のパターン作成能力が低いだけの可能性もありますが)正規表現が長く読みづらくなり、すべてのパターンで正常に動作するのかも想像が難しくなるように思えます。
まだ希望通り動いてさえいないですが...
php
1$test = <<<EOT 2<h2 title="0-1">aaa</h2> 3 <p>test</p> 4<h2 title="1-1" class="test">bbb</h2> 5<h2 title="1-2" class="test" aa="">ccc</h2> 6<h2 class="test" title="1-3">ddd</h2> 7<h2 class = "test" aa="" title="1-4">eee</h2> 8<h2 title="2-1">fff</h2> 9EOT; 10 11$replacement = '$1$3$4$5 class="test2"$7'; 12$pattern = '/(h2.*?)(\sclass\s*?=\s*?\".*?\")?(\s.+?)?(\stitle\s*?=\s*?\"1-.*?\")(.*?)?(\sclass\s*?=\s*?\".*?\")?(.*?)?(\>)/i'; 13$test = preg_replace($pattern, $replacement, $test); 14 15echo $test; 16 17/* 18<h2 title="0-1">aaa</h2> 19 <p>test</p> 20<h2 title="1-1" class="test2">bbb</h2> 21<h2 title="1-2" class="test2" aa="">ccc</h2> 22<h2 class="test" title="1-3" class="test2">ddd</h2> 23<h2 class = "test" aa="" title="1-4" class="test2">eee</h2> 24<h2 title="2-1">fff</h2> 25*/
追加で申し訳ないのですが、5(ddd),6(eee)行目の最初のclass="test"が消えないのはなぜでしょうか?
###補足
正規表現にこだわるものではありませんので、他のクラスにデータを食わせて処理したほうが簡単でしたら、それもうれしいです。ただ、PHP5.6の標準関数、標準クラスの範囲で処理可能であることが条件となります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/05 10:23
2017/02/05 11:04 編集
2017/02/05 11:41