0

我正在尝试使用 preg_match_all 获取所有 {{product.smth}},但如果我在一行中很少有这些,我会得到错误的结果。

例子:

$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()}}'

我在做什么错?请帮忙。

4

2 回答 2

3

问题是重复是贪婪的。要么通过使用使其变得不贪婪,.*?要么更好:禁止}重复字符:

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

如果您确实希望}在该值中允许单个(如{{product.some{thing}here}}),则等效解决方案使用负前瞻

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

对于其中包含的每个字符.*,检查该字符是否不标记 a 的开头}}

于 2012-11-29T23:30:51.573 回答
1

我认为如果你改变.*.*?会使它变得懒惰而不是贪婪并且它会尝试尽可能少地匹配 - 所以,直到第一次出现}}而不是最后一次出现。

于 2012-11-29T23:31:33.833 回答