0

OK、メッセージがあります。正規表現を使用して、角かっこが含まれているかどうかを判断できますか。

たとえば、角かっこの開始は次のようになります。 [code]

締めくくりはこんな感じです。 [/code]

しかし、角括弧内に入れることができるコード bbc コードだけではありません。

私ができるようにしたいのは、メッセージ全体を含む変数を使用し、次のように示される終了タグを持たない角括弧内の単語があるかどうかを何らかの形で判断することです [/] 開始タグはもちろん[単語で始まり、で終わります]

したがって、変数内に次のようなものがあるとします。

OK、これが最近のモジュールコードのすべてを含む全体的な script.php ファイルです。そこで、関数パラメーターから $params を取得するための Main 関数から始めます...

[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]andが閉じていないことを認識[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 に答える