2011-09-16 86 views
0

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

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

结算是这样的:[/code]

但也有不仅仅是代码BBC代码,可以是方括号内的方式更。

我想要做的是使用一个包含整个消息的变量,并以某种方式确定方括号内是否有任何没有结束标记的单词,如下所示:[/一句话,比] 开放标签ofcourse与[启动字,而且比结束与]

所以,如果我有一个变量中是这样的:

好了,所以这里是整个脚本。 PHP文件中的所有最近的模块代码。因此,我们开始从功能参数检索到$ 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]

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

将是巨大的,如果我可以在阵列内,比调用填充所有的标签,可以是方括号内通过一个函数来检查它是否包含开始和结束标记,这样就不会影响人们放入消息的非bbc代码标记。

任何人都可以帮我一个注册。前与这样做?至少如果有人能帮助我开始这将是优秀的。

谢谢你们:)

+0

分析问题通常比使用正则表达式更好地使用解析器处理。 –

+0

你如何解决这个问题?不熟悉解析器... – SoLoGHoST

+0

好的,问题不是解析,问题是添加结束标签到身体。解析很好。这已经通过另一个程序完成了,我只需要关闭包含所有文本的变量中的任何开始标记。想知道我能否得到这方面的帮助? – SoLoGHoST

回答

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]是无效 注意:这仅仅是一个代码示例,给你一个想法。请根据您的编程语言/框架进行修改和调整。

+0

你好,我正在使用PHP,那么我该如何调用这个解析算法?顺便说一句,谢谢,只是不知道如何使用此... – SoLoGHoST

+0

算法只是给你一个流程的想法。你必须用你自己的话来实现它。 PHP数组可以用作堆栈。请参阅函数array_push和array_pop这里:http://php.net/manual/en/function.array-pop.php PHP也是非常丰富的字符串操作函数 最后PHP具有所有描述的控制结构(while ,swaith,if等) – xtrem

+0

我不明白这段代码。这些不应该是功能的形式吗?这是一种类文件吗?我不熟悉它。需要更多帮助吗?如何调用任何这些函数或任何他们在我的代码...不知道? – SoLoGHoST