2016-07-14 3 views
1

I мое приложение У меня есть собственные теги, которые содержат другие теги. Пример:подход к анализу и проверке пользовательских

У меня есть тег с именем {БИГ}, который может содержать текст и субтегов как {BIG2} Текст {/ BIG2}

А {BIG2} родитель может быть только {БИГ} пометить {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'. Состояния немного сложнее NOTAG, TAGSTARTED, INTAG, TAGCLOSING и т.д.

В зависимости от вашей цели, что может быть проще сделать недетерминированную государственную машину; то вы добавили бы стек, в котором вы можете сохранить теги, которые уже есть, и этот стек может управляться функциями. Например, когда вы входите в {BIG}, вы кладете его в стек, а затем, когда новый тег читается, вы можете проверить верхнюю часть стека, и если все в порядке, добавьте новый тег вверху; когда вы закрываете теги, вы можете вытаскивать теги из указанного стека (потенциально проверяя, что закрывающий тег соответствует открытому).


Я надеюсь, что это поможет немного; трудно ответить на такой открытый вопрос.

Смежные вопросы