login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
De_Koffie
Moeilijkheidsgraad:
Moeilijk
Hits:
50003
Punten:
Aantal punten:
 (4.14)
Aantal stemmen:
28
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (7)
 


Tutorial:

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:

    ereg("^php",$string);

    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:

    ereg("^php$",$string);  

    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:

    • [phq0-9]
    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:

    • [0-9]+
    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':

    • (php|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©





    « Vorige tutorial : PHP in *.html Volgende tutorial : include() & require() »

    © 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.022s