Как я могу сформулировать это регулярное выражение, чтобы избежать вложенности или не жадного сопоставления?


Я разрабатываю фильтр на основе регулярных выражений для Drupal. Это регулярное выражение /[asciidoc]((.|n)*)[/asciidoc]. Когда он появляется несколько раз в тексте, все экземпляры [asciidoc] и [/asciidoc] совпадают с первым и последним экземплярами.

Напр. В коде кусок кода, как

[asciidoc] here is some text to be filtered[/asciidoc]
a bit of text
[asciidoc]some text in a second block[/asciidoc]

here is some text to be filtered и some text in a second block должны обрабатываться фильтром, но

here is some text to be filtered[/asciidoc]
a bit of text
[asciidoc]some text in a second block

Получает соответствие между первым и последним маркерами блока. Когда я тестирую в regex101 Примечания говорят, что регулярное выражение соответствует коду в блоках таким образом, это регулярное выражение greedy, которое не позволит такого рода вложенности блоков, которые мне нужны.

Каким должно быть правильное регулярное выражение? Я не знаком с жаргоном регулярных выражений, поэтому, возможно, неправильно использую некоторые термины.

1 2

1 ответ:

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

$re = '~\[asciidoc](.*?)\[/asciidoc]~s'

Демонстрация Регулярных Выражений

Если вы хотите использовать / в качестве разделителя регулярных выражений без поддержки флага DOTALL (как Javascript), то используйте:

/\[asciidoc]([\s\S]*?)\[\/asciidoc]/