我正在为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
方式匹配块中的代码,因此它是non-greedy
正则表达式,不允许这种块的嵌套我需要。
正确的正则表达式应该是什么?我对正则表达式术语不熟悉,所以可能错误地使用了一些术语。
答案 0 :(得分:1)
这个正则表达式应该使用DOTALL
标志和一个惰性量词:
$re = '~\[asciidoc](.*?)\[/asciidoc]~s'
如果您想使用/
作为正则表达式分隔符而不支持DOTALL
标志(如Javascript),请使用:
/\[asciidoc]([\s\S]*?)\[\/asciidoc]/