Как я могу использовать рекурсивное регулярное выражение или другой метод для рекурсивной проверки этой BBcode-подобной разметки в Python?

Единственный способ, который работает для меня, это: (требуется jQuery)

$(document).ready(function(e) {
    if ($.browser.webkit) {
        $('#input_id').val(' ').val('');
    }
});
1
задан Ethan J. 28 March 2019 в 05:06
поделиться

1 ответ

Ваша главная проблема в жадном жетоне ((?!\[\/\1\]).)*?.

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

Во-вторых, вы соответствуете только закрывающему тегу и не ограничивает начальный тег. Первый шаг - сделать / перед \1 необязательным, \/?. Он не остановится до [tag], как теги без атрибутов. Чтобы добавить поддержку атрибутов, добавьте необязательную группу после \1, (?:\s[^]]*)?. Он соответствует необязательной последовательности пробелов, а затем любых 0+ символов, кроме ].

Фиксированное регулярное выражение будет иметь вид

\[([biu]|h[123]|l(?:arge|ist)|small|table|grid)](?:(?!\[/?\1(?:\s[^]]*)?]).|(?R))*\[/\1]

Не забудьте скомпилировать его с regex.DOTALL, чтобы оно совпадало с несколькими символами новой строки.

0
ответ дан Wiktor Stribiżew 28 March 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: