正则表达式捕获记录PHP 2

I'm trying to get the result below, but I can not, could someone give me an idea?

My Cod.:

$string ='ZAMM Et a est hac pid pid sit amet, lacus nisi                   ZPPP scelerisque sagittis montes, porttitor ut arcu                 ZAMM tincidunt cursus eu amet nunc ZAMM c ac nunc, et pid pellentesque amet,                   ZSSS m urna scelerisque in vut';

if(preg_match_all("/ZAMM.*/", $string, $matches)) {
    foreach($matches[0] as $match){
      echo $match;
      echo "<br />";
    }
}

Expected result:

1: ZAMM Et a est hac pid pid sit amet, lacus nisi                   ZPPP scelerisque sagittis montes, porttitor ut arcu                 ZAMM tincidunt cursus eu amet nunc ZAMM c ac nunc, et pid pellentesque amet,                   ZSSS m urna scelerisque in vut

2: ZAMM tincidunt cursus eu amet nunc ZAMM c ac nunc, et pid pellentesque amet,                   ZSSS m urna scelerisque in vut

3: ZAMM c ac nunc, et pid pellentesque amet,                   ZSSS m urna scelerisque in vut
/ZAMM(.(?!ZAMM))*/

Take all following characters that are not followed by ZAMM. This is called Negative Lookahead.

.* is "greedy", so the first match will consume the entire rest of the string. Try .*? instead, to make it non-greedy.

You need to use look-aheads for this kind of thing. The pattern you need looks like this:

/ZAMM.*?(?=(ZAMM|$))/

This is where regex starts to get complex. The idea is that you're matching a string, but also looking ahead in the string to find the end point of the match. You can find out more about this and other advanced regex syntax here: http://www.regular-expressions.info/refadv.html

You also need to make the existing .* into a "non-greedy" pattern, by adding a question mark, otherwise it'll keep going to the end of the string on the first match (as it is doing already).

Hope that helps.