如何制定此正则表达式以避免嵌套或非贪婪匹配?

时间:2017-06-30 15:27:28

标签: php regex drupal-7 pcre regex-greedy

我正在为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 filteredsome 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方式匹配块中的代码,因此它是non-greedy正则表达式,不允许这种块的嵌套我需要。

正确的正则表达式应该是什么?我对正则表达式术语不熟悉,所以可能错误地使用了一些术语。

1 个答案:

答案 0 :(得分:1)

这个正则表达式应该使用DOTALL标志和一个惰性量词:

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

RegEx Demo

如果您想使用/作为正则表达式分隔符而不支持DOTALL标志(如Javascript),请使用:

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