Een regexp vraagje. Om te beginnen, een voorbeeldtemplate met daarbij de strings die ik wil hebben:
Waar het dus om draait is dat alles dat aan een bepaalde voorwaarde voldoet binnen <tr></tr> wordt uitgelezen. Ik heb veel lopen knutselen en geprobeerd en blijf hangen op:
De output van deze regexp is alleen nét niet goed, wat er namelijk nu gebeurd is dat hij de volgende blokjes pakt:
Ik krijg dus een hoop rotzooi die ik NIET wil hebben in het eerste blokje. In principe moet ik dus een rexexp hebben die ENKEL de tr begintag + voorwaarde + tr eindtag pakt. Ik heb gezocht of er een mogelijkheid was om te stellen dat er in de te pakken tekst geen <tr> mag voorkomen (zodat ik nooit meerdere <tr>'s pak zoals het geval is), maar ik krijg het niet voor elkaar een volledig woord als <tr> op de juiste manier te excluden (heb o.a. hier gezocht maar stond paar keer dat dit niet kon).
Twee andere ideeën die ik heb geprobeerd maar niet werkten, de 100 variaties zal ik jullie besparen:
Er zijn uiteraard twee SLECHTE alternatieven om mijn probleem op te lossen:
- Eerst alle tr's zonder voorwaarde eruit halen, en dan met een loop zoeken op de voorwaarde en het zo uitsorteren
- het eerste blokje een tweede keer uitfilteren
In beide gevallen geldt echter dat het minder efficient is, en dat moeten we niet hebben
Is er een mogelijkheid dit op een nette manier te doen? Als iemand kan helpen, héél graag want na uren zoeken en proberen is het me nog niet gelukt
code:
1
2
3
4
5
6
7
8
9
10
11
12
| <tr> ditwilikNIEThebben </tr> <tr> ditwilikhebben (check op voorwaarde) <tr> <tr> ditwilikhebben (check op voorwaarde) <tr> <tr> ditwilikhebben (check op voorwaarde) <tr> |
Waar het dus om draait is dat alles dat aan een bepaalde voorwaarde voldoet binnen <tr></tr> wordt uitgelezen. Ik heb veel lopen knutselen en geprobeerd en blijf hangen op:
PHP:
1
| preg_match_all ( "/<tr((.*)(voorwaarde)(.*))(<\/tr>)/smU", $content, $pregMatch ); |
De output van deze regexp is alleen nét niet goed, wat er namelijk nu gebeurd is dat hij de volgende blokjes pakt:
code:
1
2
3
4
5
6
| <tr> diewilikNIEThebben </tr> <tr> ditwilikhebben (check op voorwaarde) <tr> |
code:
1
2
3
| <tr> ditwilikhebben (check op voorwaarde) <tr> |
code:
1
2
3
| <tr> ditwilikhebben (check op voorwaarde) <tr> |
Ik krijg dus een hoop rotzooi die ik NIET wil hebben in het eerste blokje. In principe moet ik dus een rexexp hebben die ENKEL de tr begintag + voorwaarde + tr eindtag pakt. Ik heb gezocht of er een mogelijkheid was om te stellen dat er in de te pakken tekst geen <tr> mag voorkomen (zodat ik nooit meerdere <tr>'s pak zoals het geval is), maar ik krijg het niet voor elkaar een volledig woord als <tr> op de juiste manier te excluden (heb o.a. hier gezocht maar stond paar keer dat dit niet kon).
Twee andere ideeën die ik heb geprobeerd maar niet werkten, de 100 variaties zal ik jullie besparen:
PHP:
Proberen eerst alles ervoor te pakken in de hoop dat hij de juiste tr dan wel pakt1
| preg_match_all ( "/(.*)<tr((.*)(voorwaarde)(.*))(<\/tr>)/smU", $content, $pregMatch ); |
PHP:
Alle chars pakken behalve <tr> 1
| preg_match_all ( "/(.*)<tr(^(<tr>))(voorwaarde)(.*))(<\/tr>)/smU", $content, $pregMatch ); |
Er zijn uiteraard twee SLECHTE alternatieven om mijn probleem op te lossen:
- Eerst alle tr's zonder voorwaarde eruit halen, en dan met een loop zoeken op de voorwaarde en het zo uitsorteren
- het eerste blokje een tweede keer uitfilteren
In beide gevallen geldt echter dat het minder efficient is, en dat moeten we niet hebben
Is er een mogelijkheid dit op een nette manier te doen? Als iemand kan helpen, héél graag want na uren zoeken en proberen is het me nog niet gelukt
[ Voor 16% gewijzigd door Verwijderd op 24-07-2005 05:28 ]