| |
Reguliere expressies:Onderwerpen: |
Regular expressions - Deel 6
Deze pagina is op verzoek van een bezoeker teruggeplaatst. De pagina is echter vrij oud en bevat veel afwerkingsfoutjes. Gelieve hier rekening mee te houden. ModifiersHoofdlettergevoelig (case sensitive)Reguliere expressies zijn hoofdlettergevoelig. Voor een mens is een "a" en een "A" misschien niet veel verschil, maar voor een computer is dat iets totaal anders:Perl:
$tekst = "DE KAT KRABT DE KROLLEN VAN DE TRAP";
if ($tekst =~ /kat){
print ("Het woord 'kat' komt voor in de tekst.\n");
}else{
print ("Het woord 'kat' is niet gevonden.\n");
}
PHP:
Dit zal het volgende resultaat geven:
$tekst = "DE KAT KRABT DE KROLLEN VAN DE TRAP";
if (preg_match ('/kat/', $tekst)){
echo ("Het woord 'kat' komt voor in de tekst.");
}else{
echo ("Het woord 'kat' is niet gevonden.");
}
Het woord 'kat' is niet gevonden.We moeten dus in de regex zeggen dat het niet hoofdlettergevoelig is. Dit doen we door een "i" te plaatsen achter de tweede slash: Perl:
if ($tekst =~ /kat/i){
# ... wat er hier moet gebeuren
}
PHP:
"/i" is wat men noemt een modifier. Er bestaan nog andere modifiers, waaronder de volgende:
if (preg_match ('/kat/i', $tekst)){
// ... wat er hier moet gebeuren
}
Punt ook nieuwe lijnen laten meetellenWe hebben al geleerd dat een punt in een regexp dit betekent: 1 willekeurig teken, maar geen nieuwe lijn. Soms is het eerder handig dat een punt wel een nieuwe lijn meerekent. Stel, je hebt bestanden die zouden moeten beginnen met "<BEGIN CONTENT>" en eindigen met "<END CONTENT>", en je wilt voor de zekerheid in je bestand checken of de bestanden wel werkelijk aan die afspraak voldoen (je checkt in een programma altijd beter te veel dan te weinig). Dan zou je zo een regexp kunnen doen:/\ADit gaat niet werken als er nieuwe-lijnen in het bestand steken. De oplossing is de /s modifier te gebruiken: /\AEt voila.Als je nu ook nog wilt dat die "begin content" best in kleine letters mag zijn, met andere woorden: dat het niet hoofdlettergevoelig is, willen we zowel de modifier /s als de modifier /i aanzetten. Dit kunnen we doen door de twee letters gewoon achter elkaar te scrijven: /\AOf: /\ABeiden komen op hetzelfde neer. Tekst extraheren door middel van regexenNaast match checks, kijken of een string voldoet aan een patroon, kunnen we met regexen ook delen tekst halen uit strings door middel van een patroon.Dat gebeurt met haakjes. Dit zijn dezelfde haakjes als bij het groeperen.Voorbeeld: we hebben datums in het formaat "uur:minuut:second", zoals "21:46:22". Nu willen we een variabele waarin het uur steekt, een variabele waarin het aantal minuten, en een variabele waarin het aantal seconden steekt, enz. Dat kunnen we zo doen:/(\d\d):(\d\d):(\d\d)/ Perl:
In Perl wordt hetgeen dat we met haakjes in de regex uit de string halen in de variabalen $1 $2 $3 enz. gestoken:
$_='21:46:22';
/(\d\d):(\d\d):(\d\d)/;
# $1 is nu het aantal uur
# $2 is nu het aantal minuten
# $3 is nu het aantal seconden
print ("uur: $1 minuut: $2 seconden: $3\n");
Bij de volgende regex wordt $1 $2 en $3 overschreven. Als we die waarden toch willen onthouden steken we die beter even in andere variabelen:
$_='21:46:22'; /(\d\d):(\d\d):(\d\d)/; $uur = $1; $minuut = $2; $second = $3;Nu is het zo dat een regex een array teruggeeft, met daarin de waarden die we met haakjes hebben gevonden. Dus dit is ook een manier: $_='21:46:22'; @array = /(\d\d):(\d\d):(\d\d)/;Met arrays kunnen we ook zo spelen: $_='21:46:22'; ($uur, $minuut, $second) = /(\d\d):(\d\d):(\d\d)/; PHP:
In PHP wordt hetgeen dat we met haakjes in onze regex uit een string halen, in een array gestopt. We moeten alleen aan preg_match doorgeven in welke array dat moet zijn:
De check-functionaliteit van een regex blijft werken als we met haakjes werken:
$tijd = '21:46:22';
preg_match ('/(\d\d):(\d\d):(\d\d)/', $tijd, $matches);
// Nu zitten onze getallen in de array $matches.
// Nu kunnen we ermee doen wat we willen
// eenvoudig voorbeeldje: gewoon weergeven:
echo ("Uur: $matches[1], minuut: $matches[2], seconden: $matches[3]");
Merk op dat men begint te tellen vanaf het 1ste element van $mateches (dus $matches[1]), en niet vanaf het nulde element (dus niet $matches[0]). In het nulde element wordt het deel tekst gestoken dat voldoet aan het patroon (in dit geval '21:46:22').
Perl:
$_='21:46:22';
if (/(\d\d):(\d\d):(\d\d)/){
# ...
# ... code van wat we met deze gegevens willen doen
# ...
}else{
die ("Er is geen tijd gevonden in de tekst '$_' !");
}
PHP:
Gegevens uit een string halen door middel van haakjes heeft een hoop nuttige toepassingen, zoals bijvoorbeeld configuratie-bestanden uitlezen, ...
$tijd = '21:46:22';
if (preg_match ('/(\d\d):(\d\d):(\d\d)/', $tijd, $matches)){
// ...
// ... code van wat we met deze gegevens willen doen
// ...
}else{
exit ("Er is geen tijd gevonden in de tekst '$tijd'!");
}
Volgende pagina: Tekst aanpassen |
| Copyright (C) 2001-2006 Willem Penninckx | |