php
  • regex
  • pseudocode
  • 2011-01-23 10 views 2 likes 
    2

    私はこれらのような行を含むテンプレートファイルで働いています:HTMLラインと混合PHPでBBCodeに似た擬似コードを解析するには?

    [field name="main_div" type='smallblock' required="yes"] 
    [field type='bigblock' color="red" name="inner_div"] 
    [field name="btn" type='button' caption='Submit'] 
    

    属性値に従ってhtmlコードを生成するための擬似コードです。

    私は属性のセットが限られていますが、それらのすべての文字列と存在の順序を制御しません。場合によっては、「必須」属性が設定されている場合があります。

    このような文字列を解析する最も簡単で便利な方法は何ですか。私は連想配列として属性を扱うことができますか?

    正規表現、有限状態マシン、[to]から部分文字列を取得し、スペースで爆発し、等号で爆発するか?

    提供された例で動作するアドバイスや簡単なコードを探してください。

    答えて

    3

    正規表現s。このようなスキーマのためのパーサを書くことができますが、それは過度のものであり、文字化けしたトークンに対する回復力はありません。

    トリックは、[field]トークンを検索するための正規表現と、属性を分割する2つの正規表現を使用することです。

    preg_replace_callback('/\[(\w+)(\s+\w+=\pP[^"\']*\pP)*\]/', "block", $); 
    
    function block($match) { 
    
        $field = $match[1]; 
    
        preg_match_all('/(\w+)=\pP([^"\']+)\pP/', $match[2], $attr); 
        $attr = array_combine($attr[1], $attr[2]); 
    
        // ... 
        return $html; 
    } 
    
    +0

    私は、あなたが+ここで忘れてしまった、そう思う:?([^ "\ '] +) –

    +0

    @GalichevAnton:はい、あなたがそこに代わりに' * 'の' + '使用することができますまた、'変更することができます\ pP'をより明示的な '[" \ '] 'に戻します。 – mario

    +0

    私はpreg_match_all式について話していました。あなたは答えを修正することができます、私はそれを受け入れることができますか? –

    関連する問題