2011-09-16 84 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