我需要用花括号提取文本,但前提是它们中的第一个单词是“允许”单词。 例如以下文字:
awesome text,
a new line {find this braces},
{find some more} in the next line.
Please {dont find} this ones.
在这个简单的例子中,“find”代表一个允许的单词
我的尝试:
$pattern = '!{find(.*)}!is';
$matches = array();
preg_match_all( $pattern, $text, $matches, PREG_SET_ORDER );
返回一个奇怪的结果(print_r):
Array
(
[0] => Array
(
[0] => {find this braces},
{find some more} in the next line.
Please {dont find}
[1] => this braces},
{find some more} in the next line.
Please {dont find
)
)
虽然在模式中没有“找到”的情况下工作正常(但是也找到了带有“不”的那个。
原因可能是什么?
答案 0 :(得分:3)
.*
会尽可能地贪婪地匹配。使用.*?
来匹配懒惰,即尽可能少
所以你的正则表达式将是
!{find(.*?)}!is
或者,您可以使用[^{}]
代替.*?
。在这种情况下,您无需使用单线模式
!{find([^{}]*)}!i