解析和验证自定义的方法

时间:2016-07-14 16:37:05

标签: php

我的应用程序我有自定义标签,其中包含其他标签。例如:

我有一个名为{BIG}的标签,可以包含文字和子标签,例如{BIG2} text {/ BIG2}

{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
                }
            }
        }

我的问题是这种方法看起来非常脆弱和费力,我想知道我是否正确的诅咒?

我不是解决方案,因为我这样做是为了练习。我只是想知道这是解决问题的正确方法。

1 个答案:

答案 0 :(得分:0)

如果你正在做一个练习,那么可能有机会弄清楚如何创建一个状态机。它的工作方式是你创建一个矩阵,在它的一边是“状态”,在另一个“事件”上,矩阵的交集可以是一个执行的函数,或者(如果你只需要验证)下一个状态。

此处的事件可能是您的角色:'{','}','/'和'其他'。状态有点复杂NOTAGTAGSTARTEDINTAGTAGCLOSING等。

根据您的目标,制作非确定性状态机可能更容易;然后你会添加一个堆栈,在那里你可以存储你已经在的标签,并且该堆栈可以由这些功能操作。例如,当您进入{BIG}时,将其放在堆栈上,然后当读取新标签时,您可以检查堆栈顶部,如果一切正常,请在其顶部添加新标签;当您关闭标签时,您可以从所述堆栈中弹出标签(可能会检查结束标签是否与打开的标签匹配)。

我希望这会有所帮助;很难回答这样一个开放式的问题。