解析和验证自定义的方法


approach to parse and validate custom

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

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

A {BIG2} parent 只能是一个 {BIG} 标签,一个 {BIG3}

parent 应该是 {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
                }
            }
        }

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

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

如果你正在做 if 作为一个练习,它可能是一个弄清楚如何从中创建状态机的机会。它的工作方式是你创建一个矩阵,在它的一侧是"状态",在另一侧是"事件",矩阵的交集可以是要执行的函数,也可以是(如果你只需要验证)下一个状态。

这里的事件可能是你的角色:"{"、"}"、"/"和"其他任何东西"。状态有点复杂,NOTAGTAGSTARTEDINTAGTAGCLOSING等。

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


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