- ベストアンサー
[正規表現][入れ子]ネストされたリストをインデントに置換したい
- preg_replaceかpreg_replace_callbackを使って、ネストされたリストタグを全角空白によるインデントに書き換えたい。
- 1階層目のliならインデントひとつ、2階層目のliならインデントふたつという具合にしたいです。
- 置換完了後のHTMLのイメージは、文章の前にdivタグが追加され、インデントが全角空白になります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
お書きの通りの出力を得るのはちょっと面倒ですが、実用上はこれでいいと思います。 インデントが消えちゃうので、マルチステートメントにしておきます。 function repl($x){ static $n = 0; $s = ""; switch($x[0]){ case "<ul>": $r = "<div>"; $n++; break; case "</ul>": $r = "</div>"; $n--; break; case "<li>": $r = "<div>"; $s = str_repeat("□",$n); break; case "</li>": $r = "</div>"; break; } return $r.$s; } echo preg_replace_callback(":</?(ul|li)>:","repl",$str); $n は staticじゃなくてglobalにして外に出して、毎回使う前にゼロで初期化する方がいいかな。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
ulとliをそれぞれdivに変換していますが、見る限り構造に無理があります。 クラスで処理すれば、cssでいけるんじゃないでしょうか? (そもそもHTMLで全角インデントなんてまずいです) <style> div.ul { margin-left:0px; } div.li { margin-left:1em; } </style> 普通 <div class="ul"> <div class="li">リストA</div> <div class="li">リストB</div> <div class="li">リストC</div> </div> <div class="ul"> <div class="li"> <div class="ul"> <div class="li">リストあ</div> <div class="li">リストい</div> <div class="li">リストう</div> </div> </div> </div>
お礼
お礼が遅くなってしまいました。 実は携帯用表示ではリストタグの使用は避けた方が良いようなので、これを回避したかったのです。CSSも使えない場合があり、できればこれも回避したかったのです。 とはいえ、回答ありがとうございました!
お礼
こんなに早くスマートでシンプルな解決法を提示してくださってありがとうございます。 思った通りの結果が得られました。大変感謝しています。 static をこのように使ったことがなかったため勉強になりました。今後にも活かしたいと思います。