• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[正規表現][入れ子]ネストされたリストをインデントに置換したい )

[正規表現][入れ子]ネストされたリストをインデントに置換したい

このQ&Aのポイント
  • preg_replaceかpreg_replace_callbackを使って、ネストされたリストタグを全角空白によるインデントに書き換えたい。
  • 1階層目のliならインデントひとつ、2階層目のliならインデントふたつという具合にしたいです。
  • 置換完了後のHTMLのイメージは、文章の前にdivタグが追加され、インデントが全角空白になります。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

お書きの通りの出力を得るのはちょっと面倒ですが、実用上はこれでいいと思います。 インデントが消えちゃうので、マルチステートメントにしておきます。 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にして外に出して、毎回使う前にゼロで初期化する方がいいかな。

apapna
質問者

お礼

こんなに早くスマートでシンプルな解決法を提示してくださってありがとうございます。 思った通りの結果が得られました。大変感謝しています。 static をこのように使ったことがなかったため勉強になりました。今後にも活かしたいと思います。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

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>

apapna
質問者

お礼

お礼が遅くなってしまいました。 実は携帯用表示ではリストタグの使用は避けた方が良いようなので、これを回避したかったのです。CSSも使えない場合があり、できればこれも回避したかったのです。 とはいえ、回答ありがとうございました!