regexp in PHP

introductie op regexp in PHP


Zonder poespas en te lange inleidingen: Dit is een korte cursus reguliere expressies, hier toegespitst op PHP.

1. wat zijn reguliere expressies?

Reguliere expressies zijn er om een tekenreeks te analyseren aan de hand van een aantal voorwaarden. Dit houdt meestal in dat je kijkt of een tekenreeks in een bepaald formaat staat.

Een voorbeeld: een gebruiker voert een postcode of emailadres in. Aan de hand van een reguliere expressie kun je dan testen of die postcode in het juiste formaat staat en of het emailadres (theoretisch) geldig is.

Een tweede doel van reguliere expressies is het verkrijgen van een deel van de opgegeven tekenreeks. Zo kan je bijvoorbeeld op een server een opgevraagde internetlocatie ( iets.nl/00012345 ) controleren op geldigheid (een nummer van 8 karakters achter de slash) en daarna met dit nummer de eigenlijke pagina opvragen op iets.nl/pagina.php?nummer=00012345.

Reguliere expressies zijn bovendien naast zeer krachtig ook nog eens zeer snel. Dit maakt een regexp, zoals reguliere expressies vaak worden afgekort, tot een handig en soms zelfs bijna onmisbaar hulpmiddel.

2. hoe gebruik je ze in PHP?

Laten we beginnen met simpelweg te controleren of een bepaalde tekenreeks aan bepaalde voorwaarden voldoet. Dit gebeurt met

  • Preg_match( $regexp, $tekenreeks );

Deze functie geeft true terug als de tekenreeks aan de voorwaarden voldoet, en false als dit niet het geval is.

Om terug te komen op het voorbeeld van de postcode: we willen dat een postcode uit 4 hoofdletters bestaat, gevolgd door eventueel een spatie en daarna 2 cijfers. De reguliere expressie die hierbij hoort is: “/^[A-Z]{4}[ ]?[0-9]{2}$/”.

Dit ziet er op het eerste gezicht als abracadabra uit, maar is feitelijk niet erg ingewikkeld. De beginslash en de eindslash geven het begin en eind van de reguliere expressie aan. De eindslash is vooral belangrijk omdat na de eindslash eventueel nog extra zaken zoals hoofdlettergevoeligheid kunnen worden gedefinieerd.

De ^ aan het begin houdt in dat wat er na komt (hier dus de postcode) per sé aan het begin van de tekenreeks moet staan. We mogen in dit geval dus niet “heee Jan, abab89” als tekenreeks opgeven omdat daar de gezochte postcode niet aan het begin van de tekenreeks staat, maar pas na een aantal andere karakters.

Op die manier werkt ook het dollarteken op het eind. Alles voor het dollarteken moet per sé op het eind zijn van de tekenreeks staan. In dit geval mogen na de postcode dus geen andere karakters meer volgen.

Nu zijn we aangekomen bij de feitelijke tekenreekscontrole. [A-Z] geeft aan dat er een teken mag staan dat binnen het bereik A-Z valt. Dit is dus elke hoofdletter. (Let op: hoofdletters zijn in een regexp anders dan een kleine letter. “AAaA12” zal dus fout worden gerekend, en “AAAA12” goed.)

We willen echter niet slechts 1 letter hebben, maar 4. Daar dient het {4} gedeelte voor. Een {iets} slaat altijd terug op datgene wat er voor staat.

Na de 4 letters mág er een spatie komen. Dit hoeft echter niet. We zetten dus een spatie neer, met daarna een vraagteken. Dit vraagteken slaat ook weer op het voorgaande (op de spatie dus) en geeft aan dat de spatie 0 of 1 keer voor mag komen.

Nu zijn we alweer bij de cijfers aangekomen. Deze gaan op dezelfde manier als de letters en vragen om 2 keer een teken uit de 0-9 reeks.

Tot zover het vrij eenvoudige (achteraf wel, toch?) postcode-voorbeeld. Er zijn echter nog veel ingewikkelder voorbeelden te verzinnen met nog veel meer rare voorwaarden.

Al deze voorwaarden zijn te vertalen naar regexp-equivalenten.