0

我正在尝试做一个 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. 从最高位提取 _:identifier...

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

那行得通但是我不能做的是从底部提取相应的值……我的大坝正则表达式都不起作用。

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

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

问题是匹配数组作为空位置的负载(近 2000 年),它匹配所有的某个地方,而不是在第一个 ..

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

任何帮助将不胜感激:D

4

1 回答 1

3

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

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

于 2012-10-11T15:52:04.443 回答