// deze regel haalt alles op binnen [START] en [END], ik kan in het result ($matches) controleren of dat het woord {var} voor komt
preg_match_all("#\[START (.+?)\](.+?)\[END (.+?)]#s", $string, $matches);
?>
Maar hoe kan ik er nu voor zorgen dat alleen {var} (dmv str_replace ?) wordt veranderd die BUITEN een [START] [END] block staat?
Je kan hiervoor [php]preg_replace_callback[/php] gebruiken. Hoe dat in dit geval in zijn werking gaat heb ik wel in mijn hoofd, maar nog niet getest. Dus ik zal het straks (na het testen) geven.
Ik was het half vergeten, maar wat ik dacht kan ook niet. Ik denk dat je het in meerdere regexen moet knippen.
Met 1 regex haal je alles op dat niet tussen [START] en [END] staat en daarna controleer je of dit {var} bevat en dat verander je dan. Dus ong. zoals je nu bezig bent, even uit mijn hoofd:
<?php
$str = "{var} [START foo] {var} [END foo] [START bar] {var2} [END bar]";
preg_match_all('/(?:^|\[END.*?\])(.*?)\[START.*?\]/', $str, $strs);
foreach( $strs as $s )
{
// doe wat met {var}
}
?>