My First Regex

De simpelste regex is een woord, of eigenlijk een string van letters. Een reguliere expressie (regexp) die uit één woord bestaat zal met elke string matchen[1] die ook dat woord bevat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
preg_match("/World/", "Hello World"); // Matched
?>

Maar waar gaat dit nou eigenlijk over? "Hello Word" is een simpele string tussen dubbele aanhalingstekens en de // die de string World omsluiten vertellen aan php dat dat het gedeelte is waar naar gezocht moet worden.

De functie preg_match zal true of false terug geven: met matched, of het matched niet. In condities (if, for, while) zijn deze erg handig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?
if (preg_match("/World/", "Hello World")) {
    print "Het komt overeen";
}
else {
    print "Het komt niet overeen";
}

?>


Ook kunnen we de letterlijke string "Hello World" en reguliere expressie /World/ vervangen door een variabele:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?
$regex
= "/World/";
$greeting = "Hello World";
if (preg_match($regex, $greeting)) {
    print "Het komt overeen";
}
else {
    print "Het komt niet overeen";
}

?>

Ook kan je andere tekens dan // gebruiken als 'matchtekens, bijvoorbeeld !. Dit is met name handig wanneer je een iets waar veel forward slashes (/) in zitten wil matches (bijvoorbeeld een URL).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
preg_match("!World!", "Hello World");
preg_match("{World}", "Hello World");
?>

Laten we nu eens kijken welke reguliere expressies zouden overeenkomen met "Hello World".
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
preg_match("/world/", "Hello World"); // Matched niet
preg_match("/o W/", "Hello World");   // Matched
preg_match("/oW/", "Hello World");    // Matched niet
preg_match("/World /", "Hello World");// Matched niet
?>

De eerste regexp mached niet omdat regexp hoofdlettergevoelig zijn. De tweede matched omdat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
'o W'
voorkomt in
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
'Hello World'
. De spatie ' ' wordt gewoon beschouwd als een spatie en heeft geen speciale betekenis. Zonder de spatie zou deze niet werken, dit is te zien in de 3e regel, 'oW' matched niet, en in het vierde voorbeeld is te zien dat wanneer er een spatie te veel staat aan het eind van de regex. De les is dat de regexp precies moet matchen om overeen te komen.

Wanneer een regex meer dan een keer in een string voorkomt zal php altijd de eerste matchen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
preg_match("/o/", "Hello World");      // Matched de eerste 'o' in 'Hello'.
preg_match("/hat/","That hat is red"); // Matched 'hat' in 'That'
?>

Wat verder belangrijk is is dat een paar tekens (metacharacters) zijn gereserveerd voor regexp notatie.
De metacharacters zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{}[]()^$|*+?\


De significatie van elke deze zzal in de rest van de tutorial worden uitgelegd. Wat nu belangrijk is is dat een metacharacter kan gebruikt worden als letterlijk teken door er een backslash voor te zetten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?
preg_match("/2+2/","2+2=4");  // Matched niet, + is een metacharacter.
preg_match("/2\+2/","2+2=4"); // Matched, + wordt als een gewoon teken behandeld.
preg_match("/[0,1)./", "De interval is [0,1)");    // Ongeldige regexp syntax!
preg_match("/\[0,1\)\./", "De interval is [0,1)"); // matched
preg_match("/http:\/\/www.phphulp.nl\/","http://www.phphulp.nl"); // matched
preg_match("!http://www.phphulp.nl!","http://www.phphulp.nl");    // matched
?>

In de laatste twee voorbeelden is te zien hoe het af en toe handig is om bij forward slashes de delimiter (/) te vervangen door een uitroepteken of een ander teken om de leesbaarheid te vergroten.

Ook de blackslash \ is een metacharacter en moet ook geescaped worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
preg_match('/C:\\WIN/', 'C:\WIN');
?>


In alle bovenstaande regexps geld: als de regexp ook maar ergens in de string voorkomt was de expressie geldig. Soms wil je aangeven waar de string de regexp overeen zou moeten komen. Om dit te doen zijn de (anchor) metacharacters ^ en en ^ in het leven geroepen. De anchor ^ betekend dat hij aan het begin van de string zou moeten matchen en de anchor $ betekend dat hij aan het eind van de string zou moeten matchen of voor een newline aan het eind van de string.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
preg_match("/keeper/", "housekeeper");    // matches
preg_match("/^keeper/", "housekeeper");   // matched niet
preg_match("/keeper$/", "housekeeper");   // matches
preg_match("/keeper$/", "housekeeper\n"); // matches
?>


Het tweede voorbeeld matched niet omdat het ^ teken forceerd dat keeper alleen aan het begin matched, terwijl in "housekeeper" keeper in het midden begint. De derde regexp matched omdat keeper aan het einde van "housekeeper" staat.

Wanneer zowel ^ als $ in een regexp gebruikt worden moet de regexp zowel aan het begin als aan het eind matchen. Met andere woorden: de gehele string moet matchen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
preg_match("/^keep$/", "keeper");   // Matched niet
preg_match("/^keeper$/", "keeper"); // Matched
preg_match("/^$/", "");             // Matched een lege string
?>


De eerste regexp matched niet om de string uit meer bestaat dan 'keep'. De tweede regexp is precies de string en matched. if ($string == "keeper") zou dan ook nuttiger zijn in dit geval. De ^...$ syntax wordt nuttiger op het moment dat we wat krachtigere regexp tools gaan gebruiken later in de tutorial.

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Voorwoord
  2. My First Regex
  3. Het gebruik van character classes
  4. Het een of het ander matchen
  5. Groeperen en hierarchisch matchen
  6. Het extraheren van matches
  7. Repeterende matches
  8. Disclaimer, bronvermelding, handige links, TODO

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.