Preg match不会在第一场比赛时停止

时间:2012-10-11 15:44:44

标签: php regex preg-match-all

我正在尝试做一个preg_replace,以便我可以格式化从另一个程序输出的一些文本,这些文本看起来不是我想要的......

这是一个片段......

zzz:xxx1 _:somewhereElse_1 ;
xxx:yyy "dddd" ;
zzz:xxx2 _:somewhereElse_2 ;
yyy:zzz "ffff" ;   

_:somewhereElse_1
    I am somewhere else ;
 _:somewhereElse_2
    whatsup ;

我想做的是让它看起来像这样......

zzz:xxx1 I am somewhere else ;
xxx:yyy "dddd" ;
zzz:xxx2 whatsup ;
yyy:zzz "ffff" ;   

我一直试图在不同阶段做到这一点......

阶段1.从顶部位提取_:标识符...

preg_match_all("/.*:.*_:somewhereElse_[(0-9)]+/", $data, $matches);

有效 但我不能做的是从底部位提取相应的值... 没有我的大坝正则表达式工作。

如果你记住我已经提取了所有的somewhereElse_n,我能得到的最接近的是

preg_match_all("/(\n$somewhereElse_n\n.*;)?/s", $data, $matches);

问题是匹配数组作为空位的载荷(接近2000)并且它匹配所有的somewhereElse而不是在第一个之后停止..

      [1149] => 
      [1150] => 
      [1151] => 
      [1152] => 
         _:somewhereElse_1
            I am somewhere else ;
            So am i;
         _:somewhereElse_2
            whatsup ;
      [1153] => 
      [1154] => 

感谢任何帮助:D

1 个答案:

答案 0 :(得分:3)

你的.*(任何数量的任何东西)都是“贪婪的”,并且在仍然有效的情况下尝试尽可能多地匹配。因此,它从第一场比赛到最后一场比赛都是匹配的。

将其更改为.*?会使其变得非贪婪,这使得它在保持有效的同时尽可能少地匹配。因此,它应该将每个单独的匹配项匹配为单独匹配,而不是将它们全部捆绑为一个匹配。