我正在尝试做一个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
答案 0 :(得分:3)
你的.*
(任何数量的任何东西)都是“贪婪的”,并且在仍然有效的情况下尝试尽可能多地匹配。因此,它从第一场比赛到最后一场比赛都是匹配的。
将其更改为.*?
会使其变得非贪婪,这使得它在保持有效的同时尽可能少地匹配。因此,它应该将每个单独的匹配项匹配为单独匹配,而不是将它们全部捆绑为一个匹配。