[PHP] Regexp vraag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Een regexp vraagje. Om te beginnen, een voorbeeldtemplate met daarbij de strings die ik wil hebben:

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:
1
preg_match_all ( "/(.*)<tr((.*)(voorwaarde)(.*))(<\/tr>)/smU", $content, $pregMatch );
Proberen eerst alles ervoor te pakken in de hoop dat hij de juiste tr dan wel pakt
PHP:
1
preg_match_all ( "/(.*)<tr(^(<tr>))(voorwaarde)(.*))(<\/tr>)/smU", $content, $pregMatch );
Alle chars pakken behalve <tr>

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 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Verwijderd schreef op zondag 24 juli 2005 @ 05:26:
[...]
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 :)
In ieder geval het eerste alternatief is zeker niet slecht. Het probleem is dat als je het met 1 regexp wilt doen je waarschijnlijk met look-ahead assertions moet gaan werken waardoor je reguliere expressie erg complex wordt en ook nog eens erg traag. Eerst alle <tr>.*?</tr> matches eruit halen en die vervolgens filteren is qua code beter beheersbaar en hoogstwaarschijnlijk ook nog eens sneller :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op zondag 24 juli 2005 @ 12:08:
[...]

In ieder geval het eerste alternatief is zeker niet slecht. Het probleem is dat als je het met 1 regexp wilt doen je waarschijnlijk met look-ahead assertions moet gaan werken waardoor je reguliere expressie erg complex wordt en ook nog eens erg traag. Eerst alle <tr>.*?</tr> matches eruit halen en die vervolgens filteren is qua code beter beheersbaar en hoogstwaarschijnlijk ook nog eens sneller :)
De term look-ahead assertions was ik wel tegengekomen, ook eventjes mee geprutst, maar kreeg niet het gewenste resultaat (zal wel niet helemaal goed gebruikt hebben).

Maar ik zal in dit geval afgaan op wat jij zegt en gaan voor alternatief 1, snelheid is bij dit script namelijk van groot belang. :)

Heel erg bedankt!

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

met look-ahead assertions krijg je zoiets:
code:
1
/<tr[^>]*>([^<v]*|<(?!\/tr>)|v(?!oorwaarde))*voorwaarde.*?<\/tr>/is

(niet getest btw)

daar wordt je dus niet vrolijk van plus dat het ontzettend traag is...

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op zondag 24 juli 2005 @ 14:45:
met look-ahead assertions krijg je zoiets:
code:
1
/<tr[^>]*>([^<v]*|<(?!\/tr>)|v(?!oorwaarde))*voorwaarde.*?<\/tr>/is

(niet getest btw)

daar wordt je dus niet vrolijk van plus dat het ontzettend traag is...
Met name de snelheid is van belang, dus ik hou het bij optie 1 (die nu overigens prima werkt in mijn script). Maar altijd goed om te weten voor de toekomst, thanx :)

Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Misschien een vrij domme vraag hoor, maar wat is het nut van deze regex ? Wat voert hij eigenlijk uit op jouw website, want zoiets heb 'k hier nog nooit gezien :), lijkt me best interessant.

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
imp4ct schreef op maandag 25 juli 2005 @ 11:30:
Misschien een vrij domme vraag hoor, maar wat is het nut van deze regex ? Wat voert hij eigenlijk uit op jouw website, want zoiets heb 'k hier nog nooit gezien :), lijkt me best interessant.
Hij leest bepaalde websites uit op bepaalde voorwaardes. Deze voorwaardes bevinden zich vrijwel altijd binnen een <tr>. De gegevens worden opgeslagen in een database. :)

[ Voor 3% gewijzigd door Verwijderd op 25-07-2005 16:15 ]


Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Nog nooit van gehoord eigenlijk, wat is het nut van zo'n ding eigenlijk, naar wat soort waardes ben je dan bv. op zoek ? Kan je iets duidelijker zijn ofzo, of een daadwerkelijk voorbeeld geven, 'k vind het wel interessant. :)

[ Voor 32% gewijzigd door imp4ct op 25-07-2005 23:45 ]

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tja, ik moet nu een beetje kinderachtig antwoord geven; namelijk dat ik dat liever niet zeg :p Heb iets een bedacht tijdje terug, en weet niet zeker of het wat wordt maar wil het idee nog even voor mezelf houden... Dus vandaar :)

Flauw he ;)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

imp4ct:
Nog nooit van gehoord eigenlijk, wat is het nut van zo'n ding eigenlijk, naar wat soort waardes ben je dan bv. op zoek ? Kan je iets duidelijker zijn ofzo, of een daadwerkelijk voorbeeld geven, 'k vind het wel interessant. :)
Bedoel je regular expressions in het algemeen :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • imp4ct
  • Registratie: November 2003
  • Laatst online: 06-09 22:19
Verwijderd schreef op dinsdag 26 juli 2005 @ 01:29:
Tja, ik moet nu een beetje kinderachtig antwoord geven; namelijk dat ik dat liever niet zeg :p Heb iets een bedacht tijdje terug, en weet niet zeker of het wat wordt maar wil het idee nog even voor mezelf houden... Dus vandaar :)

Flauw he ;)
Niet flauw hoor :), goed te begrijpen. 'k Zit ook met zo'n soort probleem, maar dan meer over een concept van een website. Maar, dan horen we het later wel eh ?!

Bedrijf : Webtrix

Foto materiaal:
Nikon D7100 | Nikor AF-S DX 18-105mm | Nikor AF-S 50mm | Nikon SB600

Pagina: 1