Как закрыть все открытые квадратные скобки, которые не закрыты? - PullRequest
0 голосов
/ 16 сентября 2011

Хорошо, у меня есть сообщение, можно ли использовать регулярное выражение, чтобы определить, есть ли в нем квадратные скобки, и если да, определить, не закрыты ли они.

Например, и открытиеквадратная скобка выглядит так: [code]

Закрытие выглядит следующим образом: [/code]

Но есть гораздо больше, чем просто коды BBC кода, которые могут быть в квадратных скобках.

Я хотел бы иметь возможность использовать переменную, которая содержит все сообщение, и каким-то образом определить, есть ли какие-либо слова в квадратных скобках, которые не имеют закрывающего тега, который обозначается: [/ слово, а затем ] Открывающие теги курса начинаются с [ слова, а затем заканчиваются ]

Итак, если у меня есть что-то подобное в переменной:

Хорошо, вот общий файл script.php, содержащий ВСЕ код недавнего модуля.Итак, мы начнем с функции Main для получения $ params из параметра functions ...

[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, которые людивставлять в сообщения просто причина.

Может кто-нибудь дать мне руку на рег.Экс, чтобы сделать это с?По крайней мере, если кто-то может помочь мне начать это, это было бы превосходно.

Спасибо, ребята:)

1 Ответ

0 голосов
/ 16 сентября 2011

Что бы я сделал, это написал бы сканер и парсер. Проблема сбалансированных скобок является классикой в ​​теории языка.

Регулярные выражения могут использоваться для сопоставления с образцом и извлечения токена. Ваша проблема - грамматическая проблема, и вам нужен синтаксический анализатор, чтобы решить эту проблему.

В этом случае нет необходимости в сложном парсере. Стек достаточно. См. Алгоритм высокого уровня ниже.

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] недопустимо Примечание: это всего лишь пример кода, чтобы дать вам идею. Пожалуйста, уточните и настройте его в соответствии с вашим языком программирования / каркасом.

...