preg_match_all问题

时间:2012-11-29 23:28:56

标签: php regex preg-match-all

我试图通过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()}}'

我做错了什么?请帮忙。

2 个答案:

答案 0 :(得分:3)

问题在于repetition is greedy。要么使用.*?还是更好地使它不成熟:禁止}字符重复:

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

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

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

对于.*中包含的每个字符,它会检查该字符是否标记}}的开头。

答案 1 :(得分:1)

我认为如果您将.*更改为.*?这将使其 lazy 而不是贪婪,它会起作用,它会尝试匹配尽可能少 - 所以,直到第一次出现}}而不是最后一次。