0

preg_match_all ですべての {{product.smth}} を取得しようとしていますが、1 行にこれがほとんどない場合、間違った結果が得られます。

例:

$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\.((?:(?!\}\}).)*)\}\}/';

含まれるすべての文字について.*、その文字がの開始をマークしていないことを確認します}}

于 2012-11-29T23:30:51.573 に答える
1

これに変更.*すると、貪欲ではなく怠惰になり、一致をできるだけ少なくしようとするので、最後ではなく最初に発生するまで、うまくいくと思います。.*?}}

于 2012-11-29T23:31:33.833 に答える