Jump to content

[TUT] Reguliere expressies


marcootje

Recommended Posts

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 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:

^[A-Za-z ]{1,100} \d{1,10000}$

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:

^[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:

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 :puh: .

Bewerkt: door marcootje
Link to comment
Delen op andere websites

Bedankt! nu snap ik er heel wat meer van :tu:

ik heb nog 1 kleine vraag om mijn project af te sluiten:

ik heb nu mysql_real_escape_string op mijn $_POST en $_GET variabelen gezet, maar als ik data uit de database haal, moet ik dan ook die string gebruiken? (dus bv SELECT iets FROM gebruiker) en dat die daarna met die gegevens uit select iets van gebruiker UPDATE gaat doen met die select gegevens? is het dan nodig?

Link to comment
Delen op andere websites

Niet echt 'the place to ask' hier, maar goed.

Ik hoop overigens dat ik je zo goed begrijp:

Stel, je krijgt via POST bijv. de volgende straatnaam binnen:

't hoek (alias het hoekje)

In de eerste query maak je hier door middel van mysql_real_escape_string() van:

\'t hoek

Dat gaat naar de database, waarna je het een keertje weer selecteert:

't hoek

Dat krijg je dan, en dan ga je dat zonder escapen terugzetten:

't hoek

....

Dat gaat fout, de query loopt zo de soep in.

Dus ja, ook bij data uit de database is het verstandig om mysql_real_escape_string toe te passen.

Bewerkt: door marcootje
Link to comment
Delen op andere websites

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...