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.