私のスクリプトでBBCodeを解析しようとしています。さて、ボールドやアンダーライン以外のBBCode(スポイラー、URL、フォントサイズなど)をインデントしようとするまで、それは縫い目なく機能します。ここに私のコードです:再帰BBCode解析
function parse_bbcode($text) {
global $db;
$oldtext = $text;
$bbcodes = $db->select('*', 'bbcodes');
foreach ($bbcodes as $bbcode) {
switch ($bbcode->type) {
case 'simple': {
$find = '{content}';
$replace = '${1}';
$text = preg_replace(
'/\['.$bbcode->tag.'\](.+)\[\/'.$bbcode->tag.'\]/i',
str_replace($find, $replace, $bbcode->html),
$text);
break;
}
case 'property':
case 'options': {
$find = array ('{property}', '{content}');
$replace = array ('${1}', '${2}');
$text = preg_replace(
'/\['.$bbcode->tag.'\=(.[^\"]*)\](.+)\[\/'.$bbcode->tag.'\]/i',
str_replace($find, $replace, $bbcode->html),
$text);
break;
}
}
}
return $text;
}
私は推測RegExはパターンの再帰性が好きではないということです。どうすれば改善できますか?サンプルの$ bbcodeオブジェクトは次のようになります。
stdClass::__set_state(array(
'id' => '2',
'name' => 'Italic',
'type' => 'simple',
'tag' => 'i',
'button_image' => NULL,
'button_text' => '<i>I</i>',
'options' => '',
'prompt' => NULL,
'html' => '<i>{content}</i>',
'order' => '1',
))
stdClass::__set_state(array(
'id' => '3',
'name' => 'URL',
'type' => 'property',
'tag' => 'url',
'button_image' => NULL,
'button_text' => 'http://',
'options' => '',
'prompt' => 'URL address',
'html' => '<a href="{property}">{content}</a>',
'order' => '4',
))
[PHPにはBBCodeパーサーがありますので、ホイールを改造する理由はありません](http://php.net/manual/en/book.bbcode.php) – Gordon
いいえ。私はそれを知らなかった。私はそれをマークすることができるようにこれを回答するのはどうですか – casraf
私はクレメントの答えにいくつかのリンクを追加しました。代わりにそれを受け入れることを自由に感じてください:) – Gordon