Ja hoor daar zijn we weer, een nieuwe tutorial. Dit keer maak ik hem echter niet te lang, ik houd het 'compact'.
Dus hier is hij dan: een tutorial over
Reguliere Expressies
Waarom reguliere expressies?
Reguliere expressies (afkorting regex(es)) zijn ontworpen om patronen te vinden in teksten, anders gezegd: om te kijken of een bepaald patroon voorkomt in een tekst. Met deze informatie kun je heel veel, en bijvoorbeeld in php zijn heel wat functies ontworpen die op reguliere expressies voortbouwen.
In deze tutorial ga ik uit van de reguliere expressies in php. Over het algemeen zijn ze overal het zelfde, alleen soms treden er kleine verschillen op. Dit komt echter niet heel vaak voor.
Enige basiskennis van php is niet echt nodig. Ik gebruik alleen voorbeelden van $_POST. als je niet weet wat dat is, moet je gewoon daar overheen lezen.
Handigheidjes
Een handig programma om te gebruiken bij deze tutorial is The Regex Coach. Met dit programma kun je elke reguliere expressie invullen, en kijken wat eruit komt.
Een lijst met dingen die je kunt gebruiken in reguliere expressies kun je vinden op www.regular-expressions.info/reference.html
Basis
Laten we beginnen met een voorbeeldje. Je denkt een naam binnen te hebben gekregen in $_POST['naam']. Want, je mag user-input nooit vertrouwen. Hoe weten we zeker of het ook daadwerkelijk een naam is?
Eerste vraag die je je moet stellen: wat mag er in een naam zitten? Dat zijn letters in het eerste geval. We gaan nu even uit van alleen een voornaam:
[A-Za-z]+
Uitleg:
[]: tussen deze haakjes staat wat er in de tekst mag staan. wat tussen [ en ] staat heet 'karakterset'
a-z: dit zijn alle letters van a tot z. a-z mag gewoon achter A-Z, er hoeft/mag geen scheidingsteken tussen.
+: dit matcht een letter 1 of meer keer
Dit zegt: 'match datgeen dat achter elkaar de letters a tot z bevat'. Dit is echter nog niet goed, want in '123asdf123' zou het alleen al de 'asdf' accepteren. Dus wat doen we?
^[A-Za-z]+$
Een ^ stelt het begin van de tekst ('123asdf123') voor, en $ het eind.
Het zegt nu: 'match de hele string als het helemaal uit de letters a tot z bestaat'. Oftewel, als je dit op '123asdf123' uitvoert, zal er niets uitkomen.
Probeer maar uit .
Maar, wat zit er nog meer in een volledige naam? Spaties? Een punt? Een streepje? Je hebt namen als deze:
Mevr. Anneke de Boer - van Dorp
Dit moet allemaal mogen.
We krijgen dus:
^[A-Za-z -.]+$
Het spreekt redelijk voor zich, de reguliere expressie is uitgebreidt met een spatie, een - en een punt.
Matchen op vaste plaats
Je hebt ook nog een ander veldje, en je krijgt, denk je, een (nederlandse) postcode binnen via $_POST['postcode']. (Alweer: je DENKT dat). Dit moet je controleren. Hoe controleren we dat? Juist, een reguliere expressie.
Wat mag er in zitten?
- vier cijfers
- eventueel spatie
- twee letters, mag beide hoofdletters en kleine letters
Laten we het even opdelen in 3 stukjes.
Vier cijfers
Een cijfer wordt gematcht door \d, wat staat voor het engelse digit. Je kunt eventueel ook [0-9] gebruiken.
Hoe weten we zeker of iemand 4 cijfers heeft ingevuld?
De haakjes { en } introduceren het aantal keer dat een karakterset of teken herhaald moet worden.
Dit matcht 4 keer een nummer, als dat er is:
\d{4}
Een spatie of niets
We willen een spatie, of helemaal niets. Dit kun je waarschijnlijk op heel wat manieren doen, ik geef er hier twee die ik ken.
[ ]{0,1}
Hier zeggen we: match [ ] tussen de 0 en 1 keer. In praktijk is het hier dus hetzelfde als 0 óf 1 keer. Bijvoorbeeld met {0,2}, is het 0, 1 of 2 keer.
(| )
Hier hebben we opeens 2 nieuwe tekens. Dit is een standaard opdracht in regexes, en betekent 'of'. Hij matcht óf de linker kant, óf de rechterkant. In (a|b) matcht het dus a of b.
Als je aan de linkerkant dus letterlijk niets zet, en rechts een spatie, matcht je 'niets of een spatie'. Dat is precies wat we willen.
Twee letters
Twee letters is nu een makkie he?
[A-Za-z]{2}
Dit maakt onze code voor een postcode:
^\d{4}(| )[A-Za-z]{2}$
Straat
Je had toevallig ook een veldje dat binnenkomt onder de naam $_POST['straat'], oftewel de straat waar je woont + huisnummer. Dit is een beetje hetzelfde als de postcode, maar net iets anders. Wat mag er in staan?
Een punt (.)is net als [ en + een gereserveerd teken, en betekent 'match elk teken' (behalve \r en \n, dat zijn nieuwe regels ofwel enters). Maar wat als je de punt wilt gebruiken als een gewone punt? Dan plaats je een backslash voor de punt. Als je een backslash voor een gereserveerde teken zet, haal je de speciale betekenis van dat teken weg, en wordt het een 'gewoon' teken. Andersom bestaat dit ook: b is gewoon een letter, maar \d betekent opeens 'match elk cijfer'.
Dus: . betekent 'match (bijna) elk teken', en \. betekent 'match een .'.
Opdracht
Nu mag je zelf, als je dat wilt, een reguliere expressie opstellen. Waarvoor? Een email-adres!
Ik geef je een voorzetje, namelijk wat er in mag/moet:
- een reeks letters, cijfers, streepjes (midden en laag) en puntjes
- een apenstaartje / at-teken: @
- een reeks letters, cijfers, middel streepjes en puntjes
- een verplichte punt
- een reeks van minimaal 2 en maximaal 4 tekens
Probeer deze zelf te maken, en kijk dan pas naar onderstaande antwoord.
Bedenk wel dat er niet maar 1 oplossing is, maar meestal meerdere.
Een mogelijke oplossing zou kunnen zijn:
^[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$
Einde
Tot zover deze tutorial over reguliere expressies. Hier nog een paar handige links:
Ja hoor daar zijn we weer, een nieuwe tutorial. Dit keer maak ik hem echter niet te lang, ik houd het 'compact'.
Dus hier is hij dan: een tutorial over
Reguliere Expressies
Waarom reguliere expressies?
Reguliere expressies (afkorting regex(es)) zijn ontworpen om patronen te vinden in teksten, anders gezegd: om te kijken of een bepaald patroon voorkomt in een tekst. Met deze informatie kun je heel veel, en bijvoorbeeld in php zijn heel wat functies ontworpen die op reguliere expressies voortbouwen.
In deze tutorial ga ik uit van de reguliere expressies in php. Over het algemeen zijn ze overal het zelfde, alleen soms treden er kleine verschillen op. Dit komt echter niet heel vaak voor.
Enige basiskennis van php is niet echt nodig. Ik gebruik alleen voorbeelden van $_POST. als je niet weet wat dat is, moet je gewoon daar overheen lezen.
Handigheidjes
Een handig programma om te gebruiken bij deze tutorial is The Regex Coach. Met dit programma kun je elke reguliere expressie invullen, en kijken wat eruit komt.
Een lijst met dingen die je kunt gebruiken in reguliere expressies kun je vinden op www.regular-expressions.info/reference.html
Basis
Laten we beginnen met een voorbeeldje. Je denkt een naam binnen te hebben gekregen in $_POST['naam']. Want, je mag user-input nooit vertrouwen. Hoe weten we zeker of het ook daadwerkelijk een naam is?
Eerste vraag die je je moet stellen: wat mag er in een naam zitten? Dat zijn letters in het eerste geval. We gaan nu even uit van alleen een voornaam:
Uitleg:
[]: tussen deze haakjes staat wat er in de tekst mag staan. wat tussen [ en ] staat heet 'karakterset'
a-z: dit zijn alle letters van a tot z. a-z mag gewoon achter A-Z, er hoeft/mag geen scheidingsteken tussen.
+: dit matcht een letter 1 of meer keer
Dit zegt: 'match datgeen dat achter elkaar de letters a tot z bevat'. Dit is echter nog niet goed, want in '123asdf123' zou het alleen al de 'asdf' accepteren. Dus wat doen we?
Een ^ stelt het begin van de tekst ('123asdf123') voor, en $ het eind.
Het zegt nu: 'match de hele string als het helemaal uit de letters a tot z bestaat'. Oftewel, als je dit op '123asdf123' uitvoert, zal er niets uitkomen.
Probeer maar uit
.
Maar, wat zit er nog meer in een volledige naam? Spaties? Een punt? Een streepje? Je hebt namen als deze:
Mevr. Anneke de Boer - van Dorp
Dit moet allemaal mogen.
We krijgen dus:
Het spreekt redelijk voor zich, de reguliere expressie is uitgebreidt met een spatie, een - en een punt.
Matchen op vaste plaats
Je hebt ook nog een ander veldje, en je krijgt, denk je, een (nederlandse) postcode binnen via $_POST['postcode']. (Alweer: je DENKT dat). Dit moet je controleren. Hoe controleren we dat? Juist, een reguliere expressie.
Wat mag er in zitten?
- vier cijfers
- eventueel spatie
- twee letters, mag beide hoofdletters en kleine letters
Laten we het even opdelen in 3 stukjes.
Vier cijfers
Een cijfer wordt gematcht door \d, wat staat voor het engelse digit. Je kunt eventueel ook [0-9] gebruiken.
Hoe weten we zeker of iemand 4 cijfers heeft ingevuld?
De haakjes { en } introduceren het aantal keer dat een karakterset of teken herhaald moet worden.
Dit matcht 4 keer een nummer, als dat er is:
Een spatie of niets
We willen een spatie, of helemaal niets. Dit kun je waarschijnlijk op heel wat manieren doen, ik geef er hier twee die ik ken.
Hier zeggen we: match [ ] tussen de 0 en 1 keer. In praktijk is het hier dus hetzelfde als 0 óf 1 keer. Bijvoorbeeld met {0,2}, is het 0, 1 of 2 keer.
Hier hebben we opeens 2 nieuwe tekens. Dit is een standaard opdracht in regexes, en betekent 'of'. Hij matcht óf de linker kant, óf de rechterkant. In (a|b) matcht het dus a of b.
Als je aan de linkerkant dus letterlijk niets zet, en rechts een spatie, matcht je 'niets of een spatie'. Dat is precies wat we willen.
Twee letters
Twee letters is nu een makkie he?
Dit maakt onze code voor een postcode:
Straat
Je had toevallig ook een veldje dat binnenkomt onder de naam $_POST['straat'], oftewel de straat waar je woont + huisnummer. Dit is een beetje hetzelfde als de postcode, maar net iets anders. Wat mag er in staan?
- Een straatnaam, dat is ruwweg een reeks letters en spaties tussen de 1 en 100 tekens ( http://nl.wikipedia.org/wiki/Straatnaam )
- Een spatie, dit keer verplicht
- Een huisnummer tussen 1 en 10000 bijvoorbeeld
Ga zelf maar na dat dit op het volgende uitkomt:
Speciale tekens
Een punt (.)is net als [ en + een gereserveerd teken, en betekent 'match elk teken' (behalve \r en \n, dat zijn nieuwe regels ofwel enters). Maar wat als je de punt wilt gebruiken als een gewone punt? Dan plaats je een backslash voor de punt. Als je een backslash voor een gereserveerde teken zet, haal je de speciale betekenis van dat teken weg, en wordt het een 'gewoon' teken. Andersom bestaat dit ook: b is gewoon een letter, maar \d betekent opeens 'match elk cijfer'.
Dus: . betekent 'match (bijna) elk teken', en \. betekent 'match een .'.
Opdracht
Nu mag je zelf, als je dat wilt, een reguliere expressie opstellen. Waarvoor? Een email-adres!
Ik geef je een voorzetje, namelijk wat er in mag/moet:
- een reeks letters, cijfers, streepjes (midden en laag) en puntjes
- een apenstaartje / at-teken: @
- een reeks letters, cijfers, middel streepjes en puntjes
- een verplichte punt
- een reeks van minimaal 2 en maximaal 4 tekens
Probeer deze zelf te maken, en kijk dan pas naar onderstaande antwoord.
Bedenk wel dat er niet maar 1 oplossing is, maar meestal meerdere.
Een mogelijke oplossing zou kunnen zijn:
Einde
Tot zover deze tutorial over reguliere expressies. Hier nog een paar handige links:
http://www.regular-expressions.info/reference.html - Een overzicht met wat je in reguliere expressies kunt gebruiken (link werkt mogelijk niet, even kopieren & plakken)
http://www.regular-expressions.info/tutorial.html - Een engelstalige tutorial over reguliere expressies
http://nl3.php.net/manual/en/ref.pcre.php - Een overzicht van de perl-implementaties van de reguliere expressies in php
En natuurlijk de 'regex coach' uit de 'handigheidjes'.
Beoordelingen, correcties en tips zijn welkom!
PS: Sorry voor de lichtelijke onoverzichtelijkheid
.
Bewerkt: door marcootje