Reguliere Expressies
Reguliere expressies
vormen een methode waarmee in strings naar bepaalde patronen kan worden gezocht.
Een dergelijk patroon kan bestaan uit een string met een verzameling tekens
waarnaar letterlijk wordt gezocht, of een string met daarin bepaalde "jokertekens",
maar het kan ook gaan om een zeer ingewikkelde verzameling tekens en voorwaarden.
In dit voorbeeld zie je een zeer eenvoudige reguliere expressie die kan worden
gebruikt om e-mail adressen te herkennen:
^[_.0-9a-z-]+@([0-9a-z][0-9a-z]+.)+[a-z]{2,3}$
|
Als je geen enkele
ervaring hebt met reguliere expressies, zal je hier waarschijnlijk niets van
snappen, maar het kan nog veel erger ;) Dit is zelfs nog niet eens een absoluut
correcte expressie om e-mails na te kijken, in feite zou het nog veel uitgebreider
moeten zijn!
Er zijn drie varianten
van reguliere expressies die je kan gebruiken in PHP en MySQL:
1. de normale PHP-functies:
De overige functies
zijn functies die overeenkomen met de Perl manier om dit te gebruiken. Deze bieden
een extra functionaliteit die niet zomaar met de PHP - functies bereikt kan worden!
Maar daar ga ik in deze tutorial niet verder op ingaan.
Letterlijke
Patronen
De eenvoudigste
zoekmethode kan je uitvoeren door gebruik te maken van een serie bekende tekens.
Zo kan je met het volgende voorbeeld in een string zoeken naar het woord 'php':
<?php
$string = "Dit
is een string in php";
if(ereg("php",$string)) {
echo "Het
patroon is gevonden!";
} else {
echo "Het
patroon is NIET gevonden!";
}
?>
De voorwaarde
in de if-opdracht zal de waarde true opleveren en de tekst 'Het patroon is gevonden!'
weergeven!
In een zoekopdracht zo eenvoudig als deze heb je eigenlijk geen reguliere expressie
nodig. Je kan de zoekopdracht in dit geval beter met een andere functie van
php gebruiken: bijvoorbeeld: strstr($string,"php);
Speciale tekens
In reguliere expressies
kan je de volgende speciale tekens gebruiken:
-
: newline
( = regel einde)
- : tab
-
: return
- f : form feed
- ^ : begin van
de string
- $ : einde van
de string
- . : ieder willekeurig
teken, behalve een regelEINDE. (dit is inderdaad een punt ;) )
Als je dus op zoek
bent naar het woord "php" aan het BEGIN van een string, kan je bijvoorbeeld de
volgende functie gebruiken:
Als je er zeker
van wil zijn dat er in string geen tekens VOOR of NA het woord "php" voorkomen,
kan je bijvoorbeeld het volgende doen:
Opgelet : het
gebruik van de punt:
Dit teken wordt gebruikt als "jokerteken" voor een willekeurig teken, behalve
een regeleinde. Op die manier kan je met de volgende code de eerste vier tekens
weergeven die volgen op het woord "php" in een string:
<?php
ereg("php(....)",$string,$array);
echo $array[1];
?>
Met de haakjes
() wordt een substring aangeduid!
Als het gezochte patroon wordt gevonden bij het uitvoeren van ereg(), dan bevat
$array[0] van de array (in de derde parameter) de complete gevonden string (inclusief
substrings!), terwijl iedere substring wordt opgeslagen als een nieuw element
van de array!
Dus, in dit voorbeeld worden de vier tekens die volgen op "php" opgeslagen in
het twee element van de array, dus $array[1] !
Tekenklassen
Als je wilt zoeken
naar een bepaalde VERZAMELING van tekens, moet je tekenklassen gebruiken. Hierdoor
kan je bijvoorbeeld dus nagaan of een bepaalde groep van tekens bestaat uit
alleen cijfers, alleen letters, etc ...
Er zijn reeds enkele ingebouwde tekenklassen die je kan gebruiken, maar je kan
ook zelf tekenklassen definiëren!
Ingebouwde
tekenklassen
- [[:alpha:]]
: Iedere hoofdletter of kleine letter.
- [[:digit:]]
: Cijfers (van 0 tot 9)
- [[:space:]]
: Alle tekens voor een witruimte; zoals spaties, tabs, regeleinden (=newlines),
returns en form feeds.
- [[:upper:]]
: alleen hoofdletters
- [[:lower:]]
: alleen kleine letters
- [[:punct:]]
: alle interpunctietekens
- [[:xdigit:]]
: alle mogelijke hexadecimale tekens
Bijvoorbeeld, je
wil er zeker van zijn dat een brief de correcte interpunctie heeft na de eerste
regel "Geachte Heer":
(* interpunctieteken : een komma of een punt of een puntkomma,...)
ereg ("Heer[[:punct:]]",$string);
|
Zelfgedefinieerde
tekenklassen
Met vierkante
haken kan je zelf tekenklassen aanmaken! Dit doe je door een bereik van tekens
op te geven of door een opsomming te geven. Hier zijn enkele veel gebruikte
tekenklassen zoals je ze zelf kan definiëren:
- a-z : iedere
kleine letter
- A-Z : iedere
hoofdletter
- 0-9 : ieder
cijfer
Dit zijn tekenklassen
die je waarschijnlijk vaak nodig zult hebben.
Je kan ook een klasse definiëren met [a-m] of [0-4], dus een tekenklasse met een
bepaald 'bereik': in het geval van [a-m] zullen dus alle letters van het alfabat
tussen a en m gevonden worden. Bij [0-4] worden er dus alleen maar de cijfers
0,1,2,3 of 4 gevonden
Je kan dus ook
een klasse definiëren met meerdere bereiken, zoals bijvoorbeeld:
- [a-zA-Z] :
dit zal dus ALLE letters vinden, zowel hoofd- als kleine letters!
(deze klasse is wel
hetzelfde als [[:alpha:]] !)
Een zelfgemaakte
tekenklasse hoeft niet echt een bereik te bevatte; je kan ook iedere gewenste
combinatie van bereik en tekens gebruiken! Voorbeeld:
Met deze klasse zal
je dus de tekens p, h en q vinden en ook alle willekeurige cijfers! De volgende
code zal je dus "TRUE" opleveren:
<?php
$string = "prle";
if(ereg("^[phq0-9]",$string)) {
echo "TRUE";
} else {
echo "FALSE";
}
?>
Het script zal
dus "TRUE" weergeven, omdat het EERSTE teken in $string voorkomt in de gedefinieerde
klasse!
Meervoudige
tekenherkenning
We kunnen dus
ook zoeken naar patronen die meer dan één keer voorkomen in een string. Vanaf
hier begint het er al wat moeilijker uit te zien.
De volgende speciale tekens worden het meest gebruikt om te zoeken naar meerdere
tekens:
- * : nul of
meer keren het voorgaande teken
- + : één of
meer keren het voorgaande teken
- ? : nul of
één keer het voorgaande teken
Indien je één van
deze tekens LETTERLIJK wil zoeken, moet je (zoals je waarschijnlijk al wel kon
raden ;) ) er gewoon een backslash () voorplaatsen (= het escapeteken).
Voorbeeld: je zoekt naar de query string van een url, zoals http://www.sitemasters.be/?action=php
moet je dus ?action=php vinden! Dit kan je dus doen met de volgende reguliere
expressie:
Met de eerste twee
tekens van deze expressie (?) wordt er dus gezocht naar een vraagteken (?). Het
zoekt dus letterlijk naar een vraagteken omdat we er een backslash () hebben
voorgeplaatst! Met het punt (.) geven we vervolgens aan dat we zoeken naar eendert
welk teken (zolang als het maar geen regeleinde is), terwijl de asterisk (*) aangeeft
dat het voorafgaande teken nul keer of vaker mag voorkomen!
Met de combinatie .* zoeken we dus naar een willekeurige hoeveelheid willekeurige
tekens tot AAN het regeleinde ($). Door het dollarteken ($) geven we dus ook aan
dat we zoeken aan het EINDE van de string (aangezien de query in een url altijd
achteraan staat natuurlijk! ;) )
Dit voorbeeld in PHP geeft je zoiets als:
<?php
$string = "http://www.sitemasters.be/?action=php&pagina=variabele";
//
let op het gebruik van SUBSTRING
//
om de query in de array te plaatsen!!
//
(zie eerder deze tutorial)
if(ereg("?(.*)$",$string,$array)) {
echo "De
query string is dus: " . $array[1];
}
?>
Bovenstaand voorbeeld
moet je dus als resultaat opleveren: 'De query string is dus: action=php&pagina=variabele'
Vervolgens is
hier een voorbeeldje om je aan te tonen hoe je met het plusteken (+) moet werken:
Hiermee vind je dus
één of meer achtereenvolgende cijfers. In php zou het zoiets moeten worden:
ereg("php[0-9]+",$string);
|
Als $string gelijk
is aan 'php4', dan zal deze ereg() je de waarde TRUE opleveren, maar de string
'phpq' zal je FALSE opleveren. Als $string gelijk is aan 'php422' levert ereg()
nog steeds TRUE op, omdat 'php' gevolgd wordt door één of meerdere cijfers!
Zelfs de string 'php484561987491521mysql' zal je de waarde TRUE opleveren.
Je kan ook het
aantal cijfers opgeven dat mag herkend worden; hiervoor gebruik je accolades
({ }):
- {5} : met één
cijfer tussen de accolades geef je aan dat je zoekt naar PRECIES dat aantal
van het voorgaande teken. Dus zal met p{5} alleen maar de string 'ppppp' gevonden
worden.
- {3, 5} : met
twee cijfers geef je een bereik aan: het aantal voorgaande tekens dat mag
herkend worden. Dus met p{3,5} zal je dus de strings 'ppp','pppp' en 'ppppp'
vinden.
- {3, } met één
cijfer GEVOLGD door een komma geef je een minimumaantal aan voor het voorgaande
teken. Dus met p{3, } zal je de strings 'ppp','pppp', enz.. vinden.
Nota:
Je kan dus ook
opgeven dat je zoekt naar een bepaald patroon of een bepaald ander patroon.
Als dit het geval is moet je het pipe-teken gebruiken (|). Meestal zal je dit
teken binnen haakjes gebruiken om te zoeken naar delen van strings. Zo kan je
met de volgende reguliere expressie zoeken naar de tekst 'php' of 'mysql':
Voorbeeldje:
Met bovenstaande
uitleg denk ik dat je nu toch wel een groot deel van reguliere expressies kan
begrijpen. Als je er meer over wil weten moet je maar wat sites afschuimen en
vooral, eens kijken op de PHP site.
Hier volgt nog even een kort en eenvoudig voorbeeldje, ik heb deze snel uitgevonden
maar ik hoop dat het nog wat kan bijdragen om alles wat duidelijker te maken!
Stel, je hebt
een anker tag. En daaruit wil je de HREF property lezen. (dus de url waar die
link moet naar verwijzen). Deze zal er bijvoorbeeld zo uit zien:
- <a href="../mijn_pagina.php">dit
is mijn link</a>
Je zal dus waarschijnlijk
meteen denken dat je moet zoeken naar alles vanaf 'href="' tot aan het afsluitende
dubbele aanhalingsteken, dus zoals:
<?php
if(ereg('<a
href="(.*)"',$anker_tag,$array)) {
echo $array[1];
}
?>
if(ereg('<a.*href[[:space:]]?=[[:space:]]?"(.*)"',$anker_tag,$array)) {
echo $array[1];
}
?>
Aangezien het
vraagteken betekent dat we zoeken naar 'één of nul van het voorgaande teken',
betekent [[:space:]]? dus dat we zoeken naar één of geen spatie.
Als laatste moeten
we er nu nog voor zorgen dat we de INHOUD van de 'href' property correct kunnen
vinden. We hebben tot nu toe alleen maar rekening gehouden met gevallen waarbij
de link begrensd wordt door dubbele aanhalingstekens (")! Dit kan OOK begrensd
worden door enkele aanhalingstekens ('). Daarom moeten we een tekenklasse definiëren
die de dubbele en enkele aanhalingstekens inhoudt.
MAAR: hou er rekening mee dat we de expressie tot nu toe omgeven hebben met
enkele aanhalingstekens (') !! Dus moeten we het enkele aanhalingsteken in de
expressie vooraf laten gaan door een backslash ( = het escapeteken!). De tekenklasse
wordt dus:
en de php code wordt:
<?php
if(ereg('<a.*href[[:space:]]?=[[:space:]]?["']?(.*)["']?',$anker_tag,$array)) {
echo $array[1];
}
?>
Hierbij eindigt
deze tutorial. Ik hoop alvast dat je er wat van hebt kunnen opsteken en wens
je veel geluk met je verdere php scripts ;)
In geval van enige vragen, stel ze gerust op het forum of stuur me een bericht!
Mvg,
De KoFfie©
|