0

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

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

关闭是这样的: [/code]

但是,方括号中的代码不仅仅是 bbc 代码。

我想要做的是使用一个包含整个消息的变量,并以某种方式确定方括号内是否有任何没有结束标记 [/的单词,表示为:单词,然后] 打开标签当然以[单词开头,然后以]

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

好的,这是整个 script.php 文件,其中包含所有最近的模块代码。因此,我们从 Main 函数开始,用于从 functions 参数中检索 $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]and[tr][td]没有关闭,它应该按以下顺序将结束标签添加到其中:

[/td][/tr]最后[/table]

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

如果我可以填充数组中方括号内的所有标签,而不是调用一个检查它是否同时具有开始和结束标签的函数,那就太好了,这样它就不会影响非 bbc 代码标签人们投入信息只是因为。

谁能帮我看看Reg。前做这个?至少如果有人可以帮助我开始这将是非常好的。

多谢你们 :)

4

1 回答 1

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] 无效 注意:这只是一个代码示例,可以让您了解一下。请根据您的编程语言/框架对其进行改进和调整。

于 2011-09-16T19:26:05.563 回答