2016-07-14 7 views
1

私のアプリケーション私は他のタグを含むカスタムタグを持っています。例:カスタムを解析して検証するアプローチ

I有しのみ{BIG}であることができる{BIG2}テキスト{/ BIG2}

A {BIG2}親のようなテキストとサブタグを含むことができる{BIG} {BIG3を}タグ名前タグ親は{BIG3}でなければなりません。

私はそれが理に適ったと思います。

私の現在の方法は、テキスト全体を繰り返し、{文字を確認して、その開始タグまたは終了タグの意味を理解することです。

for ($i = 0; $i < strlen($this->input); $i++) { 
      $char = $this->input[$i]; 

      if ($char == '{') { 
       if ($this->input[$i + 1] == '/') { 
        // close tag 
        echo 'close tag on pos: ' . ($i + 1); 
       } else { 
        // open tag 
       } 
      } 
     } 

私の問題は、このアプローチは非常に壊れやすいと面倒なようで、私が正しい呪いの午前場合、私は思っていたのですか?

私はこれを練習として行っているので解決策はありません。私は、これが問題を解決する正しい方法であることを知りたいだけです。

答えて

0

練習としては、これから状態マシンを作成する方法を理解する機会があるかもしれません。それが動作する方法は、行列を作成することです。行列の片側には「状態」があり、別の「イベント」には行列の共通部分が実行する関数か、次の行列を検証する必要がある場合のみです状態。

ここでのイベントは「{'、'} '、'/'、' anything else 'の文字です。状態は少し複雑ですNOTAGTAGSTARTEDINTAGTAGCLOSINGなど

それは多分簡単に非決定ステートマシンを作るためにあなたの目標によっては、すでにスタックしているタグを格納できるスタックを追加し、そのスタックを関数で操作することができます。たとえば、{BIG}と入力すると、そのタグをスタックに置くと、新しいタグが読み込まれたときにスタックの先頭を確認できます。すべてがOKであれば、その上に新しいタグを追加します。タグを閉じると、スタックからタグをポップすることができます(閉じたタグが開かれたタグと一致するかどうかを確認することができます)。


これが少し助けてくれることを願っています。そのような自由回答の質問に答えることは難しいです。

関連する問題