[regex] excluden bij str_replace
Jaron T
08/02/2012 18:58:37Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$string = "{var} [START abc] {var} [END abc] [START troll] {var2} [END troll] hoi";
// 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);
?>
$string = "{var} [START abc] {var} [END abc] [START troll] {var2} [END troll] hoi";
// 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?
Ik hoop dat het allemaal een beetje duidelijk is.
Alvast bedankt.
PHP hulp
27/11/2024 05:26:38Wouter J
08/02/2012 19:12:23Je kan hiervoor preg_replace_callback 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.
Gewijzigd op 09/02/2012 19:47:37 door Wouter J
Jaron T
08/02/2012 19:44:38Oké, alvast bedankt!
Gewijzigd op 09/02/2012 19:44:31 door Jaron T
Jaron T
09/02/2012 19:44:42Jaron T
11/02/2012 16:10:06Wouter J
12/02/2012 15:48:22Ik 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:
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?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}
}
?>
$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}
}
?>
Edit:
Oeps, foutje. Probeer dit eens
Gewijzigd op 12/02/2012 16:59:57 door Wouter J
Jaron T
12/02/2012 16:38:26Bedankt voor de reactie, maar dit geeft als output;
Terwijl ik toch de waardes buiten het "block" moet krijgen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Array
(
[0] => {var} [START foo] {var} [END foo]
[1] => [START bar] {var2} [END bar]
)
Array
(
[0] => {var} [START foo] {var}
[1] => {var2}
)
(
[0] => {var} [START foo] {var} [END foo]
[1] => [START bar] {var2} [END bar]
)
Array
(
[0] => {var} [START foo] {var}
[1] => {var2}
)
Terwijl ik toch de waardes buiten het "block" moet krijgen?