Ik wil een xml bestand inlezen met php. Ben nu al een paar dagen aan het klooien met regex en het gaat steeds beter, toch loop ik vast.
Dit is de regex zoals ik hem nu heb:
Met deze regex heb ik het probleem dat hij alleen zelf sluitende tags pakt. Voordat ik deze had aangepast had ik hem zonder de lookahead. Echter was de regex toen greedy. Waardoor hij de eerste opentag ( = <tagnaam >) en de laatste sluittag ( = </tagnaam>) pakte.
Het lijkt me duidelijk dat deze greedy is. Met zelfsluitende tags werkt dit echter wel.
Hoe maak ik de laatste regex non-greedy op de bijbehoorden sluittag?
Dit is de regex zoals ik hem nu heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| /<([a-zA-z][a-zA-z0-9]*)([^>]*)(\/>|>([.(?!<\/\\1>)]*)<\/\\1>)/s Even opsplitsen voor mijn gedachtegang / < // Opentag ([a-zA-z][a-zA-z0-9]*) // Tagnaam ([^>]*) // Alle attributen als 1 string (\/> // Zelf sluitende tag | // OF > //Dicht ([.(?!<\/\\1>)]*) //Alle chars zolang maar niet gevolgt door een sluitende tag met Opentag <\/\\1>) // Een sluittag /s // Einde regex, let niet op whitespace |
Met deze regex heb ik het probleem dat hij alleen zelf sluitende tags pakt. Voordat ik deze had aangepast had ik hem zonder de lookahead. Echter was de regex toen greedy. Waardoor hij de eerste opentag ( = <tagnaam >) en de laatste sluittag ( = </tagnaam>) pakte.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| /<([a-zA-z][a-zA-z0-9]*)([^>]*)(\/>|>(.*)<\/\\1>)/s even opslitsen: / < // Opentag ([a-zA-z][a-zA-z0-9]*) // Tagnaam ([^>]*) // Alle attributen als 1 string (\/> // Zelf sluitende tag | // OF > //Dicht (.*) //Alle chars <\/\\1>) // Een sluittag /s // Einde regex, let niet op whitespace |
Het lijkt me duidelijk dat deze greedy is. Met zelfsluitende tags werkt dit echter wel.
Hoe maak ik de laatste regex non-greedy op de bijbehoorden sluittag?
[ Voor 5% gewijzigd door storeman op 12-03-2007 16:10 ]
"Chaos kan niet uit de hand lopen"