[php] preg_match_all vraagje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • chielsen
  • Registratie: Oktober 2003
  • Laatst online: 20-09 01:17
Ik zit hier nu al een tijdje te kutten, maar kom er niet uit.
Ik wil alle stukken tussen <PHP></PHP> tags uitlezen en de rest later weer aan elkaar plakken.

Dit is even een testje:
PHP:
1
2
3
4
$test = "<OUTPUT>misschien</OUTPUT><PHP>\$sekse = \$sekse . 'uit';</PHP><OUTPUT>ja</OUTPUT>
    <PHP>\$sekse = \$sekse . 'in';</PHP><OUTPUT>nee</OUTPUT>";
    
preg_match_all("/(.*?)<PHP>(.*?)<\/PHP>(.*?)/is", $test, $matches);


Als output krijg ik:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
    [1] => Array
        (
            [0] => <OUTPUT>misschien</OUTPUT>
            [1] => <OUTPUT>ja</OUTPUT>
    
        )

    [2] => Array
        (
            [0] => $sekse = $sekse . 'uit';
            [1] => $sekse = $sekse . 'in';
        )

    [3] => Array
        (
            [0] => 
            [1] => 
        )

)


Hij pakt de stukken phpcode wel goed, en die 2 outputs ook wel in index 1, maar hij pakt niks in index3 (dus <OUTPUT>nee</OUTPUT> mist).

Als ik dit van de expressie weghaal ( (.*?) ), wat op het eind staat, dan krijg ik nog steeds hetzelfde.. Hoe kan ik ervoor zorgen dat ik ook die <OUTPUT>nee</OUTPUT> krijg?

Acties:
  • 0 Henk 'm!

  • Vesta
  • Registratie: November 2004
  • Niet online
chielsen schreef op dinsdag 09 augustus 2005 @ 10:18:
Ik zit hier nu al een tijdje te kutten, maar kom er niet uit.
Ik wil alle stukken tussen <PHP></PHP> tags uitlezen en de rest later weer aan elkaar plakken.

[..]
Hij pakt de stukken phpcode wel goed, en die 2 outputs ook wel in index 1, maar hij pakt niks in index3 (dus <OUTPUT>nee</OUTPUT> mist).

Als ik dit van de expressie weghaal ( (.*?) ), wat op het eind staat, dan krijg ik nog steeds hetzelfde.. Hoe kan ik ervoor zorgen dat ik ook die <OUTPUT>nee</OUTPUT> krijg?
In de php manual staat:
After the first match is found, the subsequent searches are continued on from end of the last match.
Het klopt dus dat de laatste <output> niet gepakt wordt, aangezien deze niet matcht. Je moet je pattern dus zo schrijven dat die ook de "rest" (tot het einde) matcht:
code:
1
/(.*?)(?:<PHP>(.*?)<\/PHP>|$)/is
Ik ben geen regex goeroe, dus het kan ws beter ;)