人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでWiki記法を以下のようにHTMLに変換したいのですが、入れ子でかつ、リストと番号付きリストが混在しても問題なく出力できるやり方が思いつきません。

ソース付きで、かつ問題なく動いた回答には300ポイントお支払いさせて頂きます。よろしくお願いします。

■Wiki記法
- リスト1
- リスト2
-+ 番号付きリスト1
-+ 番号付きリスト2
-++ 番号付きリスト3
-++ 番号付きリスト4
-- リスト3
-- リスト4

■HTMLに変換
<ul><li>リスト1</li>
<li>リスト2
<ol><li>番号付きリスト1</li>
<li>番号付きリスト2
<ol><li>番号付きリスト3</li>
<li>番号付きリスト4</li></ol></li></ol>
<ul><li>リスト3</li>
<li>リスト4</li></ul></li></ul>


●質問者: xxmasaxx
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:HTML PHP Wiki ソース ポイント
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● GoldenDawn
●300ポイント ベストアンサー

wiki記法のあとのスペースはそのままにしてあります。

<pre>
<?php
$text = <<< ENDTEXT
- リスト1
- リスト2
-+ 番号付きリスト1
-+ 番号付きリスト2
-++ 番号付きリスト3
-++ 番号付きリスト4
-- リスト3
-- リスト4
ENDTEXT;

function close_list($list) {
 $ret = '' ;
 while ($t = array_pop($list)) $ret .= '</li>'.($t == '-' ? '</ul>' : '</ol>') ;
 return $ret."\n" ;
}

$lines = preg_split('/[\r\n]+/', $text) ;
$output = '' ;
$list = array() ;

foreach ($lines as $one) {
 if ($one == '' || preg_match('/^\s+$/', $one)) continue ;
 $cl = trim($one, '-+') ;
 if (preg_match('/^[-+]+/', $one, $cl)) {
 $cl = str_split($cl[0]) ;

 if ($cl == $list) $output .= "</li>\n" ;
 else {
 $cp = $cl ;

 while($cp && $cp[0] == $list[0]) {
 array_shift($cp) ;
 array_shift($list) ;
 }

 if ($list) $output .= close_list($list) ;
 elseif ($output != '') $output .= "\n" ;
 foreach ($cp as $t) $output .= $t == '-' ? '<ul>' : '<ol>' ;
 }

 $output .= '<li>'.ltrim($one, '-+') ;
 $list = $cl ;
 }
}
$output .= close_list($list) ;


echo htmlspecialchars($output) ;
?>
</pre>
◎質問者からの返答

動作確認はまだ行ってませんが、問題ないようなら有り難く使わせて頂きます。

回答有り難うございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ