2010-12-09 53 views
1

匹配顺序我有问题的正则表达式中PHP

The quick brown {fox} jumps over the lazy {dog} 

我需要匹配包含在{}可发生在文本几次任何字符串以下示例文本。
我试着下面的代码,但它不能正常工作

<?php 

$matches = array(); 

$string = "The quick brown {fox} jumps over the lazy {dog}"; 

preg_match("/\{(.*)\}/",$string,$matches); 

print_r($matches); 

?> 

,这就是我得到

Array 
(
    [0] => {fox} jumps over the lazy {dog} 
    [1] => fox} jumps over the lazy {dog 
) 

我希望得到

Array 
(
    [0] => {fox} jumps over the lazy {dog} 
    [1] => fox 
    [2] => dog 
) 

所以,我怎么能强迫PHP匹配最近的“}”而不是匹配最后一个?

回答

3

您现有的正则表达式有.*这是贪婪和尝试消耗尽可能。为了解决这个问题,你需要通过在结尾处增加一个?,以使正则表达式非贪婪

.*? 

另外,您还可以代替.*使用[^}]*

而且因为你希望所有的比赛,你需要使用preg_match_all

See it

+0

这很好。你能解释一下用法吗?在这种情况下 ?这种用法是否记录在案 – AssemblerGuy 2010-12-09 15:03:44

0

默认情况下,你的正则表达式是贪婪模式下执行。你需要不太认真。要么使用/ U开关,要么使用codaddict建议的*。使这个表达式的部分不合理

0

默认情况下,表达式是贪婪的,即他们试图抓取最长可能的匹配。您可以使用U标志表达不明确:

preg_match('/\{(.*)\}/U', $string, $matches);