我的应用程序我有自定义标签,其中包含其他标签。例如:
我有一个名为{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
}
}
}
我的问题是这种方法看起来非常脆弱和费力,我想知道我是否正确的诅咒?
我不是解决方案,因为我这样做是为了练习。我只是想知道这是解决问题的正确方法。
答案 0 :(得分:0)
如果你正在做一个练习,那么可能有机会弄清楚如何创建一个状态机。它的工作方式是你创建一个矩阵,在它的一边是“状态”,在另一个“事件”上,矩阵的交集可以是一个执行的函数,或者(如果你只需要验证)下一个状态。
此处的事件可能是您的角色:'{','}','/'和'其他'。状态有点复杂NOTAG
,TAGSTARTED
,INTAG
,TAGCLOSING
等。
根据您的目标,制作非确定性状态机可能更容易;然后你会添加一个堆栈,在那里你可以存储你已经在的标签,并且该堆栈可以由这些功能操作。例如,当您进入{BIG}
时,将其放在堆栈上,然后当读取新标签时,您可以检查堆栈顶部,如果一切正常,请在其顶部添加新标签;当您关闭标签时,您可以从所述堆栈中弹出标签(可能会检查结束标签是否与打开的标签匹配)。
我希望这会有所帮助;很难回答这样一个开放式的问题。