Как я могу сформулировать это регулярное выражение, чтобы избежать вложенности или не жадного сопоставления?
Я разрабатываю фильтр на основе регулярных выражений для 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 ответ:
Это регулярное выражение должно работать с флагом
DOTALL
и ленивым квантором:$re = '~\[asciidoc](.*?)\[/asciidoc]~s'
Демонстрация Регулярных Выражений
Если вы хотите использовать
/
в качестве разделителя регулярных выражений без поддержки флагаDOTALL
(как Javascript), то используйте:/\[asciidoc]([\s\S]*?)\[\/asciidoc]/