Programmeren in PHP/Reguliere Expressies
Inleiding
Een reguliere expressie kun je gebruiken om strings te doorzoeken. Met reguliere expressies kun je bijvoorbeeld dit onderzoeken:
- Op de derde positie moet een letter staan van d tot en met y;
- Is het een geldig e-mailadres (letters@letters.2 of 3 letters)?
- Is het een geldige naam (Hoofdletter-kleine letters-spatie-Hoofdletter-kleine letters)?
Functies
Er zijn veel functies om reguliere expressies te gebruiken, maar de bekendste is ereg
. Deze functie krijgt twee argumenten mee:
- de reguliere expressie;
- de te doorzoeken string.
Als de reguliere expressie gevonden is in de string, dan retourneert ereg
TRUE
. Als de string niet gevonden is, FALSE
.
Er is ook een hoofdletterongevoelige variant van ereg
: eregi
(De i is van case-insensitive).
Deze functies kunnen ook een optioneel derde argument meekrijgen.
...
Syntax van Regexps
Een reguliere expressie is in feite niks meer dan een manier voor het vervangen van tekst of het vinden van tekst. Je hebt twee soorten reguliere expressies namelijk: Letterlijke Patronen en tekenklassen. Om een start te maken, geven wij een voorbeeld van een letterlijk patroon in PHP.
Letterlijke patronen
PHP-code:
<?php
$string = "Dit is een tekst over reguliere expressies";
if( ereg( "tekst", $string ) ) {
echo "Het woord tekst is gevonden";
} else {
echo "Het woord tekst is niet gevonden";
}
?>
In dit voorbeeldje wordt er gezocht naar het letterlijke woord: tekst. De functie die dit kan heet ereg. Syntax:
ereg ( string $pattern, string $string [, array &$regs] )
Dit was best makkelijk niet? Dan gaan we nu het echte werk doen met tekenklassen oftewel de echte reguliere expressies.
Tekenklassen
Oké, nu wordt het spannend. We gaan echte reguliere expressies behandelen. Laten we eerst even wat basiscommando's opnoemen die je vast wel al kent.
- - \n Dit betekent newline, je raadt het al: een nieuwe regel.
- - \t Tab.
- - \r Return (\r\n betekent in Windows newline.)
- - $ Einde van een string
- - ^ Dit is het begin van een string.
- - . Een punt: Elke willekeurig karakter behalve \r en \n.
- - \\ Omdat de backslash speciaal wordt gebruikt, moet je als je een backslash wilt vinden het dubbel typen (escapen).
Verder zijn er nog wat andere commando's:
- - ? Dit betekent dat het voorgaande karakter optioneel is.
- - *? Dit betekent dat het karakter wat ervoor staat geen of meer keer kan worden herhaald als dat nodig is om het te laten kloppen. (lui)
- - * Dit is hetzelfde als het sterretje-vraagteken, maar probeert zo veel mogelijk karakters te matchen voor naar het volgend karakter te gaan.
- - + Dit betekent dat het karakter een of meer keer voorkomt.
- - +? Dit betekent hetzelfde als het plusje, maar dan heeft het de voorkeur naar zo min mogelijk karakters. (lui)
- - {n} Dit betekent dat het voorgaande karakter n keer moet voorkomen.
- - {n,m} Dit betekent dat het voorgaande karakter tussen n en m keer moet voorkomen.
- - | Hiermee geef je aan dat of hetgeen links ervan dan wel rechts ervan moet matchen.
Dit was niet zo moeilijk, hè? Ok, genoeg theorie, nu even de praktijk. Wat heb je hier aan? Je wilt er zeker van zijn dat er geen tekens na en voor een bepaalde string komen. Dit kun je zo controleren:
ereg( "^tekst$", "Een stukje tekst" )
.
Als je dit zou uitvoeren in PHP, zou je de waarde 0 krijgen, oftewel geen match, want er staan tekens voor de gezochte tekst. Zou je dit veranderen in
ereg( "tekst$", "Een stukje tekst" )
Op dit moment, je raadt het al, wordt een 1 teruggeven. Oftewel een match.
Tekenreeksen
In regexp kan je ook tekenreeksen gebruiken. Tekenreeksen hebben deze syntax: [A-Za-z] Deze reeks matcht elke letter tussen A en Z en a en z. De A-Z en de a-z kunnen door elke reeks worden vervangen, bijvoorbeeld ook 0-9.
Bijvoorbeeld [A-Za-z0-9] matcht alle normale tekens.
Hier wordt het in een voorbeeld gebruikt om een e-mailadres te valideren:
ereg("^.+@.+\.{2,4}[a-z]$","info@wikibooks.org"]);
Conclusie
Met regexp kan je bijna alles. Op internet wordt het ook vaak gebruikt bij de Apache mod Mod Rewrite.