PDA

Bekijk Volledige Versie : [PHP] Regular expression met /* in string



Dennis
02/07/04, 22:25
Ik heb een regular expression in PHP om .nl domeinnamen te controleren.
Deze ziet er als volgt uit:

preg_match("/^[a-z0-9]+(-?[a-z0-9]+)+\.nl$/", $domein_adjusted,$matches)

Dit werkt op zich prima, maar geeft een fout bij de volgende waarde voor
$domein_adjusted:

1234567892345781234684769123123456789/*.nl

Php (versie 4.3.2) zegt dat de maximum execution time wordt overschreden.
Het vreemde is nu dat andere regular expressions geen moeite hebben met
deze string en dat ook bijvoorbeeld 1234684769123/*.nl er zonder moeite
doorheen komt.

Frapant is dat ook een oudere versie van Editpad Pro crashde met dezelfde
expressies. Is dit een bekende fout, of zie ik iets stoms over het hoofd?

Dennis

robert
02/07/04, 22:55
Dennis <dennis@spreekjemoerstaal.nl>:
> Ik heb een regular expression in PHP om .nl domeinnamen te controleren.
> Deze ziet er als volgt uit:
>
> preg_match("/^[a-z0-9]+(-?[a-z0-9]+)+\.nl$/", $domein_adjusted,$matches)
>
> Dit werkt op zich prima, maar geeft een fout bij de volgende waarde voor
> $domein_adjusted:
>
> 1234567892345781234684769123123456789/*.nl
>
> Php (versie 4.3.2) zegt dat de maximum execution time wordt overschreden.

Heeft te maken met de hoeveelheid manieren waarop bovengenoemde RE een
string kan matchen. Als je de RE herschrijft duurt het nog steeds erg
lang: /([0-9]+)+\.nl$/

Juist omdat die RE niet matcht met $domein_adjusted (vanwege de /* die
daarin staan) gaat de RE-engine continu backtracken om te kijken of er niet
een andere manier is om die string te matchen. En dat gaat, denk ik, zo
ongeveer als volgt:
- 1
- 1, 2
- (1, 2), 3
- 1, (2, 3)
- (1, 2, 3), 4
- (1, 2), (3, 4)
- 1, (2, 3, 4)
- 1, (2, 3), 4
- 1, (2, 3, 4)
....

Hoe langer de string, des te langer het duurt om erachter te komen dat het
_echt_ niet matcht. En de tijd die dat kost stijgt exponentieel aan de
lengte van de string die je probeert te matchen.

Je zult 'em moeten herschrijven, en daarbij moet je rekening houden met het
feit dat constructies in de vorm (.+)+ proberen op gaan leveren.

--
robert