2011-07-21 15 views
2

私のスクリプトで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', 
)) 
+9

[PHPにはBBCodeパーサーがありますので、ホイールを改造する理由はありません](http://php.net/manual/en/book.bbcode.php) – Gordon

+0

いいえ。私はそれを知らなかった。私はそれをマークすることができるようにこれを回答するのはどうですか – casraf

+0

私はクレメントの答えにいくつかのリンクを追加しました。代わりにそれを受け入れることを自由に感じてください:) – Gordon

答えて

6

ゴードンはコメントPHP has a BBCode parser, so no reason to reinvent the wheelでこう言いました。

ネイティブパーサーはPECLパッケージですので、インストールする必要があります。 http://pear.php.net/package/HTML_BBCodeParser

さらに、BBコードのソースコードを使ってフォーラムを見ることができます。また、パーサー、または改善する。 http://www.bbcode.org/implementations.php

+1

Ty forあなたの精度@Gordon –

+0

ようこそ。 – Gordon

+0

PECLパッケージは素晴らしいようですが、私はそれをインストールすることはできません... PEARは不自由です:/ – casraf

0

正規表現を使用してBBcodeを正しく解析するのは非trivalです。コードはネストすることができます。 CODEタグには、パーサーが無視する必要があるBBCodeを含めることができます。一部のタグは他のタグの内側に表示されないことがあります。しかし、それは行うことができます。私は最近、FluxBBオープンソースフォーラムソフトウェアのBBCodeパーサーを見直しました。あなたはアクションでそれをチェックアウトすることもできます。

New 2011 FluxBB Parser

この新しいパーサがまだFluxBBのコードベースに組み込まれていないことに注意してください。

+0

これは完全に動作しますか?そして、自分のBBCodeをどのくらい簡単に追加できますか? – casraf

+0

はい、動作しています(上記のリンクはこのパーサを使用するテストフォーラムです)。これは一般的なパーサーではありません。FluxBBで動作するように特別に設計されています。 [documentation](http://jmrware.com/articles/2011/fluxbb_jmr_dev/viewforum.php?id=1)と[ソースコード](https://github.com/jmrware/)を読む必要があります。 fluxbb_jmr_dev/blob/dev/include/parser.php)。あなたはPHPプログラマで、[正規表現](http://jmrware.com/articles/2011/fluxbb_jmr_dev/viewtopic.php?id=3)に精通していると思います。私が言ったように、BBCodeを解析するのは簡単ではありません。 – ridgerunner

+0

ええと、私はPHPとRegExに精通していますが(質問があります)、BBCodeは再帰的になるまで構文解析するだけの簡単さです。 – casraf