Let op: Tweakers stopt per 2023 met Tweakblogs. In
dit artikel
leggen we uit waarom we hiervoor hebben gekozen.
Valideren kun je leren
Een veelgebruikte methode om gebruikersinvoer te controleren op bepaalde eigenschappen is het toepassen van reguliere expressies.
Maar in plaats van het probleem van onbetrouwbare invoer op te lossen, komt er in veel gevallen juist een probleem bij: Zorgen dat de validatie precies doet wat het moet doen.
Zoals ik vandaag reeds in een reactie op een ander blog heb vermeld, is het niet noodzakelijk om het wiel opnieuw uit te vinden. De meeste validaties worden immers door veel meer personen gebruikt, waardoor er vaak over nagedacht is.
Ook zijn er voldoende verzamelingen te vinden van goed bruikbare expressies, zoals bijvoorbeeld De OWASP Regex Repository.
Natuurlijk blijft hetzelfde probleem bestaan. Een enkel karakter kan een wereld van verschil maken met reguliere expressies. Denk bijvoorbeeld maar aan het weglaten of toevoegen van een ^ teken aan het begin van de expressie. Enige kennis is daarom noodzakelijk om er zeker van de zijn dat de gebruikte expressie zijn doel bereikt (en niet voorbijschiet).
Enkele belangrijke karakters/eigenschappen zijn de volgende:
Maar in plaats van het probleem van onbetrouwbare invoer op te lossen, komt er in veel gevallen juist een probleem bij: Zorgen dat de validatie precies doet wat het moet doen.
Zoals ik vandaag reeds in een reactie op een ander blog heb vermeld, is het niet noodzakelijk om het wiel opnieuw uit te vinden. De meeste validaties worden immers door veel meer personen gebruikt, waardoor er vaak over nagedacht is.
Ook zijn er voldoende verzamelingen te vinden van goed bruikbare expressies, zoals bijvoorbeeld De OWASP Regex Repository.
Natuurlijk blijft hetzelfde probleem bestaan. Een enkel karakter kan een wereld van verschil maken met reguliere expressies. Denk bijvoorbeeld maar aan het weglaten of toevoegen van een ^ teken aan het begin van de expressie. Enige kennis is daarom noodzakelijk om er zeker van de zijn dat de gebruikte expressie zijn doel bereikt (en niet voorbijschiet).
Enkele belangrijke karakters/eigenschappen zijn de volgende:
- Een ^ aan het begin van de expressie geeft aan dat de onderzochte tekst moet beginnen met het gezochte patroon.
- Een $ aan het einde van de expressie geeft aan dat de onderzochte tekst moet eindigen met het gezochte patroon.
- Tekens die tussen [ en ] staan: Een teken uit deze groep moet aanwezig zijn.
- . een willekeurig karakter
- + Het teken (of de groepering) voor de + moet minstens 1 keer voorkomen
- * Het teken (of de groepering) voor de * mag een willekeurig aantal keer voorkomen (ook 0 keer)
- ? Het teken voor de ? is optioneel ( 0 of 1 keer voorkomen)
- {x,y} Het teken of de reeks voor de { } moet minstens X en maximaal Y keer voorkomen
10-'10 Advanced PHP, maar dan anders
02-'09 Gratis: 6 (of 2?) onbeveiligde vrienden
Reacties
Naar mijn idee zijn regexen overrated. Iedereen gebruikt ze overal voor, terwijl er vele alternatieven zijn die sneller zijn en/of beter in onderhoud. Ik gebruik zelf ook nooit regexen, maar zal altijd met simpeler methoden werken. En als je vervolgens de data op de juiste manier escaped, zullen er eigenlijk geen problemen optreden 
Handig, dat maakt regexps weer een stukje makkelijker. Thanks! 
ZO zitten Regexen dus in mekaar
(serieus...)
Ik vind regexpen leuke dingen, maar je moet inderdaad wel weten wanneer het WEL of NIET handig is.
Meestal zie je een leuke trend onder mensen die nog net met regexp beginnen, dan zie je dat ze daadwerkelijk alles in een regexp proberen te dumpen (deed ik ook
). En dan komt later het besef van.. eeeeuh... dat had veel makkelijker in een NIET-regexp dingetje gekund. En daarna zie je 'dat moet regexp, dat niet' beter gebruikt. Nouja, sommige mensen zullen het nooit leren, ik ken iemand die echt alles te moeilijk wilt maken. 
Meestal zie je een leuke trend onder mensen die nog net met regexp beginnen, dan zie je dat ze daadwerkelijk alles in een regexp proberen te dumpen (deed ik ook
Dat het leuke dingen zijn ben ik met je eens, maar ik heb soms het idee dat het een taal apart is. Overzichtelijk vind ik die dingen niet en ik weet ook nooit hoe ik ze zelf op moet bouwen (terwijl ik toch al een jaartje of 5 in PHP programmeer). Vandaar dat ik enkel reguliere expressies gebruik bij het filteren van bijvoorbeeld content van een website. Valideren van veelgebruikte userinput kan met de komst van PHP5.2.0 gelukkig met de functie filter_var.
Het is altijd maar de vraag of de reguliere expressies, zelfs die waar 'over nagedacht' zijn, wel precies doen wat je wilt. Over het algemeen doen ze namelijk maar ongeveer wat je wilt en zijn het slechts filters die nog steeds mogelijke invalide input doorlaten (en in een enkel geval ook valide input als incorrect bestempelen). Ik zie op de OWASP pagina die je linkt zo al dat de eerste 3 expressies (url, IP en e-mail) gewoon niet RFC-compliant zijn...
De filter_var validatiefuncties zijn ook alles behalve perfect...Valideren van veelgebruikte userinput kan met de komst van PHP5.2.0 gelukkig met de functie filter_var.
[Reactie gewijzigd op maandag 15 juni 2009 23:31]
Ik ben wel benieuwd waar je op doelt. Natuurlijk zijn regexen niet nodig om te kijken of iets een nummer is (zoals de typefreak al noemt), maar soms wil je toch echt wel regexen gebruiken (UBB codes omzetten naar html bijvoorbeeld).terwijl er vele alternatieven zijn die sneller zijn en/of beter in onderhoud
Daarnaast is het inderdaad de vraag in hoeverre je php functies als filter_var() kan vertrouwen, zoals crisp al aangeeft.
Helemaal mee eens met de twee reacties hierboven...
En wat dacht je van url rewriten? Daar moet je echt wel regex voor gebruiken en in zo'n geval, mits je het een beetje kent, is het ideaal!
Een geweldige site om je regex mee op te bouwen / te testen / te leren: http://gskinner.com/RegExr/
En wat dacht je van url rewriten? Daar moet je echt wel regex voor gebruiken en in zo'n geval, mits je het een beetje kent, is het ideaal!
Een geweldige site om je regex mee op te bouwen / te testen / te leren: http://gskinner.com/RegExr/
Daar wil je het liefst een tokenizer voor gebruiken met daar bovenop een stack-based parsermaar soms wil je toch echt wel regexen gebruiken (UBB codes omzetten naar html bijvoorbeeld).
is_numeric()? Dan wel gelijk goed graag, en ctype_digit() 
Maar verder mooie post!
Maar verder mooie post!
Dan wil je juist geen regex gebruiken maar een stack based parser bijvoorbeeld.(UBB codes omzetten naar html bijvoorbeeld).
edit:
Crap; crisp's reactie niet gezien
Crap; crisp's reactie niet gezien
mod_rewrite is gebaseerd op regexes ja; maar dat is maar 1 implementatie. Ik heb mijn eigen "mod_rewrite" systeempje op classic(!) ASP hartstikke leuk draaien zonder 1 regex.En wat dacht je van url rewriten? Daar moet je echt wel regex voor gebruiken en in zo'n geval
[Reactie gewijzigd op dinsdag 16 juni 2009 00:57]
regex mist voor mij een belangrijke feature. stel het volgende voor:
input moet zijn: 'baas' of 'boos'.
Dan wil ik dat als volgt kunnen checken:
eerst een b
(dan twee aa's
- of -
twee oo's)
dan een s
maar ik wordt verplicht mijn regex als volgt op te bouwen:
eerst een b
dan twee aa's
dan een s
- of-
eerst een b
dan twee oo's
dan een s
input moet zijn: 'baas' of 'boos'.
Dan wil ik dat als volgt kunnen checken:
eerst een b
(dan twee aa's
- of -
twee oo's)
dan een s
maar ik wordt verplicht mijn regex als volgt op te bouwen:
eerst een b
dan twee aa's
dan een s
- of-
eerst een b
dan twee oo's
dan een s
@barleone: standaard reguliere expressies kunnen dat gewoon:
/b(aa|oo)s/
http://en.wikipedia.org/wiki/Regex#Basic_concepts
/b(aa|oo)s/
http://en.wikipedia.org/wiki/Regex#Basic_concepts
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
Opvallend is ook de bijzonder beroerde regex kennis onder bachelor IT studenten. Ik ken geen enkele opleiding in belgie waar dit deel uit maakt van het curriculum terwijl vaak complexere problemen hier eenvoudig(er) mee op te lossen zijn.
Als je met regex begint kan je trouwens best een speciaal tootje installeren, ik vond regexbuddy bijzonder gemakkelijk om snel iets op te stellen.
Als je met regex begint kan je trouwens best een speciaal tootje installeren, ik vond regexbuddy bijzonder gemakkelijk om snel iets op te stellen.
[Reactie gewijzigd op zondag 10 oktober 2010 18:34]
Reageren is niet meer mogelijk