
[正規表現][入れ子]ネストされたリストをインデントに置換したい
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>
----------------------------------------------------------------------------
どうぞ、よろしくお願い致します。
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にして外に出して、毎回使う前にゼロで初期化する方がいいかな。
こんなに早くスマートでシンプルな解決法を提示してくださってありがとうございます。
思った通りの結果が得られました。大変感謝しています。
static をこのように使ったことがなかったため勉強になりました。今後にも活かしたいと思います。
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>
お礼が遅くなってしまいました。
実は携帯用表示ではリストタグの使用は避けた方が良いようなので、これを回避したかったのです。CSSも使えない場合があり、できればこれも回避したかったのです。
とはいえ、回答ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列のから一致する文字列を検...
-
ASP.NET(C#)とhtmlの#include
-
Accessの文字数を調べたい
-
VBAのコマンドボタンの文字列の...
-
文字の入力で横バー上段、中断...
-
C++で空Enterの入力を判...
-
PHP+Postgres 「髙」が文字化け
-
バーコード入力と手入力の判断...
-
FORTRANで作成したテキストファ...
-
メッセージボックスで1025文字...
-
文字化け変換方法
-
1行ごとに取得して、その改行...
-
CSVファイルの改行コード判別
-
カンマの含まれる文字列の数値...
-
エクセルのCOUNTIFが正しくカウ...
-
マクロで半角を全角に
-
PHPの¥
-
文字列を文字コードの数値に変...
-
preg_matchでエラーが出ます。
-
ダイアログにおける改行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
reuterの記事をbeautiful.soup....
-
PHPでPostgresqlのテーブルを使...
-
[php][正規表現]タグ以外を削除...
-
タグにはさまれている文字以外...
-
ASP.NET(C#)とhtmlの#include
-
phpの正規表現でstyle="●●"を削...
-
PHP Webページのタイトルを取得...
-
Strutsでリンクを動的に生成したい
-
htmlタグ間の特定文字置換
-
[正規表現][入れ子]ネストされ...
-
Nvuで作成したhtmlをコピペして...
-
preg_match_all関数でaタグの属...
-
eclipseより、タスク・タグの使...
-
firefoxで、特定の文字列を含む...
-
タグのエスケープについて
-
正規表現で複数行に渡る範囲を...
-
htmlのソースからテーブルの値...
-
VBSでのhtmlタグ要素名の置換
-
htmlの一部を読み込んで表示する。
-
alt属性を残してタグを排除
おすすめ情報