我试图通过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()}}'
我做错了什么?请帮忙。
答案 0 :(得分:3)
问题在于repetition is greedy。要么使用.*?
还是更好地使它不成熟:禁止}
字符重复:
$pattern = '/\{\{product\.([^}]*)\}\}/';
如果您确实希望在该值中允许单个}
(例如{{product.some{thing}here}}
),则等效解决方案使用negative lookahead:
$pattern = '/\{\{product\.((?:(?!\}\}).)*)\}\}/';
对于.*
中包含的每个字符,它会检查该字符是否标记}}
的开头。
答案 1 :(得分:1)
我认为如果您将.*
更改为.*?
这将使其 lazy 而不是贪婪,它会起作用,它会尝试匹配尽可能少 - 所以,直到第一次出现}}
而不是最后一次。