如何关闭所有未关闭的开口方括号标签?

时间:2011-09-16 18:50:34

标签: bbcode square-bracket

好的,我有一条消息,可以使用正则表达式来确定其中是否有方括号,如果有,请确定它们是否未关闭。

例如,打开方括号是这样的:[code]

结束是这样的:[/code]

但不仅仅是代码bbc代码可以在方括号内。

我希望能够做的是使用包含整个消息的变量,并以某种方式确定方括号内是否有任何没有结束标记的单词,表示为:{{ 1}}这个词,而不是[/ 打开课程标记以]单词开头,而不是以[

结尾

所以,如果我在变量中有这样的东西:

好的,所以这里是整个script.php文件,其中包含所有Recent Module代码。所以我们从Main函数开始,从函数参数...

中检索$ params
]

它会知道[code]function module_recent($params) { global $context, $txt; // Grab the params, if they exist. if (is_array($params)) { 未关闭并在最后添加[code]

但是,如果我有这样的事情:

[/code]

应该知道[table] [tr][td]Hello World[/td][/tr] [tr][td]This is not closed... [table]以及[tr]没有关闭,它应该按照以下顺序在最后添加结束标记:

[td]而不是[/td],最后是[/tr]

但也有其他标签,如[/table]

如果我可以填充数组中方括号内的所有标记,并调用一个检查它是否同时具有开始和结束标记的函数,那将会很棒,这样就不会影响非人们放入消息的bbc代码标签就是原因。

任何人都可以帮我一个Reg。要做到这一点吗?至少如果有人可以帮助我开始这个非常好的。

谢谢你们:)

1 个答案:

答案 0 :(得分:0)

我要做的是编写一个扫描仪和一个解析器。平衡括号问题是语言理论中的经典问题。

正则表达式可用于模式匹配和标记提取。你的问题是一个语法问题,你需要一个解析器来解决这个问题。

在这种情况下不需要复杂的解析器。堆栈就足够了。请参阅下面的高级算法。

enum TokenType{
    StartTag,
    EndTag,
    Text
}

struct Token {
    string Value;
    TokenType TokenType;
}

Token GetNextToken() {
    // returns the next token in the input string or null if end of the string.
}

bool MatchingTags(Token startTag, Token endTag)){
    // check if startTag and endTag match
}

bool CheckTags(){
    Stack stack = new Stack();
    while( (Token t = GetNextToken()) != null )
    {
        switch(t.TokenType){
            case TokenType.StartTag:
                stack.push(t);
            break;
            case TokenType.EndTag:
                Token lastPushed = stack.pop();
                if( ! MatchingTags(lastPushed, t)){
                    return false
                }
            break;
        }
    }
    if (! stack.IsEmpty()){
        return false
    }else{
        return true;
    }
}

注意:此算法还会检查正确的嵌套:[A] [B] [/ A] [/ B]无效 注意:这只是一个代码示例,可以为您提供一个想法。请根据您的编程语言/框架进行优化和调整。