重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

preg_replaceかpreg_replace_callbackを使って、
ネストされたリストタグを全角空白によるインデントに書き換えたく思っています。
(携帯表示するため)

1階層目のliならインデントひとつ。
2階層目のliならインデントふたつ。



という具合にしたいのです。


以下は全角空白をわかりやすくするために□で置き換えました。

----------------------------------------------------------------------------
【現在のHTML】

文章1
文章2
<ul>
 <li>リストA</li>
 <li>リストB</li>
 <li>リストC</li>
</ul>
<ul>
 <li>
  <ul>
   <li>リストあ</li>
   <li>リストい</li>
   <li>リストう</li>
  </ul>
 </li>
</ul>

----------------------------------------------------------------------------
【置換完了後のブラウザ表示】
文章1
文章2
□リストA
□リストB
□リストC
□□リストあ
□□リストい
□□リストう


----------------------------------------------------------------------------
【置換完了後のHTMLのイメージ】

文章1
文章2
<div>
 <div>□リストA</div>
 <div>□リストB</div>
 <div>□リストC</div>
</div>
<div>
 <div>
  <div>
   <div>□□リストあ</div>
   <div>□□リストい</div>
   <div>□□リストう</div>
  </div>
 </div>
</div>

----------------------------------------------------------------------------

どうぞ、よろしくお願い致します。

A 回答 (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にして外に出して、毎回使う前にゼロで初期化する方がいいかな。
    • good
    • 0
この回答へのお礼

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

static をこのように使ったことがなかったため勉強になりました。今後にも活かしたいと思います。

お礼日時:2009/12/26 16:57

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>
    • good
    • 0
この回答へのお礼

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

とはいえ、回答ありがとうございました!

お礼日時:2009/12/30 21:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!