我的应用程序我有包含其他标签的自定义标签。例:
我有一个名为 {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 作为一个练习,它可能是一个弄清楚如何从中创建状态机的机会。它的工作方式是你创建一个矩阵,在它的一侧是"状态",在另一侧是"事件",矩阵的交集可以是要执行的函数,也可以是(如果你只需要验证)下一个状态。
这里的事件可能是你的角色:"{"、"}"、"/"和"其他任何东西"。状态有点复杂,NOTAG
、TAGSTARTED
、INTAG
、TAGCLOSING
等。
根据您的目标,制作非确定性状态机可能更容易;然后您将添加一个堆栈,您可以在其中存储您已经存在的标签,并且该堆栈可以由函数操作。例如,当您输入 {BIG}
时,您将其放在堆栈上,然后在读取新标签时,您可以检查堆栈的顶部,如果一切正常,则在其顶部添加新标签;当您关闭标签时,您可以从所述堆栈中弹出标签(可能检查结束标签是否与打开的标签匹配)。
我希望这会有所帮助;很难回答这样一个开放式问题。