2012-11-29 35 views
0

我试图用preg_match_all获得所有{{product.smth}},但是如果我在一行中没有这样的内容,我会得到错误的结果。preg_match_all问题

例子:

$smth = '<name>{{product.name}}</name><getname>{{product.getName()}}</getname>'; 

$pattern = '/\{\{product\.(.*)\}\}/'; 
preg_match_all($pattern, $smth, $matches); 

//returns '{{product.name}}</name><getname>{{product.getName()}}' 
//instad of '{{product.name}}' and '{{product.getName()}}' 

什么IAM做错了什么?请帮忙。

+0

使用'/ U'修饰符。 –

+0

@Ωmega我更喜欢修饰符:)注意,ungreedy只是与它切换,所以'/.*?/ U'就是贪婪的例子。 –

回答

3

问题是repetition is greedy。要么使它ungreedy使用.*?或更好的:禁止对}字符重复:

$pattern = '/\{\{product\.([^}]*)\}\}/'; 

如果你想允许单}在价值(如{{product.some{thing}here}}),相当于解决方案使用negative lookahead

$pattern = '/\{\{product\.((?:(?!\}\}).)*)\}\}/'; 

对于每一个字符包含在.*它会检查该字符并不标志着一个}}的开始。

1

我认为,如果你改变.*.*?它会工作这将使贪婪懒惰来代替,而它会尝试尽可能少的匹配 - 所以,直到的}}第一次出现,而不是持续。

+0

难道只是称为不真实吗?否则你会从一个罪到另一个:) –

+0

_拉齐量词有时也被称为“不理智”或“不情愿”_来源:http://www.regular-expressions.info/repeat.html – Halcyon