| |
Reguliere expressies:Onderwerpen: |
Regular expressions - Deel 7
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. Tekst aanpassenNaast kijken of een string voldoet aan een patroon en tekst halen uit een string kunnen we ook tekst veranderen.Perl:
Het volgende voorbeeld verandert de eerste "a" in een string in een "X":
$tekst = "De kat krabt de krollen van de trap"; $tekst =~ s/a/X/; print ($tekst); # geeft: "De kXt krabt de krollen van de trap"Voor de eerste slash moet er een "s" staan. Deze "s" duidt aan dat we niet gewoon naar tekst gaan zoeken, maar ze ook gaan aanpassen. Alles wat tussen de eerste en de tweede slash staat vervangen we door wat er tussen de tweede en de derde slash staan.Het resultaat van deze search-and-replace wordt in dezelfde variabele gestoken, in dit geval $tekst.Eventuele modifiers worden geplaatst na de derde slash: $tekst =~ s/a/b/i; PHP:
Voor tekst te veranderen is er in PHP een andere functie: preg_replace. Het eerste argument is het pattern (patroon), het tweede de string waardoor hetgeen we zoeken vervangen moet worden, het derde de string waarin we zoeken en vervangen. De functie geeft het resultaat van onze search-and-replace-actie terug. Bijvoorbeeld: als we alle "a"'s willen vervangen door een "X":
We kunnen nog steeds alle dingen gebruiken die we in een patroon hebben geleerd, zoals bijvoorbeeld character classes.
$tekst = "De kat krabt de krollen van de trap";
$resultaat = preg_replace ('/a/', 'X', $tekst);
// $resultaat is nu "De kXt krXbt de krollen vXn de trXp"
Perl:
Als ik bijvoorbeeld wil dat een "a" of een "e" vervangen worden door een X, kan ik dit doen:
$tekst = "De kat krabt de krollen van de trap"; $tekst =~ s/[ae]/X/; # $tekst is nu "DX kat krabt de krollon van de trap" PHP:
Als ik bijvoorbeeld wil dat alle a's en alle e's vervangen worden door X'en, kan ik dit doen:
$tekst = "De kat krabt de krollen van de trap";
$resultaat = preg_replace ('/[ae]/', 'X', $tekst);
// $resultaat is nu "DX kXt krXbt dX krollXn vXn dX trXp"
Heel logisch maar misschien wat verwarrend is het feit dat het volledig stukje tekst van de string dat door het patroon gevonden wordt, vervangen wordt. Perl:
$tekst = "de KAT KRABT DE krollen van de trap"; $tekst =~ /[A-Z ]+/X/; # $tekst is nu "deXkrollen van de trap"Hierbij is het deel tekst dat gevonden wordt " KAT KRABT DE ", en heel dit deeltje tekst wordt vervangen door "X".Voorts is zo een search-and-replace nog steeds als check te gebruiken in bijvoorbeeld een if:
$tekst = "de KAT KRABT DE krollen van de trap";
if ($tekst =~ /[A-Z ]+/X/){
# ... hier wat er moet gebeuren als het vervangen gelukt is
}
PHP:
$tekst = "de KAT KRABT DE krollen van de trap";
$resultaat = preg_replace ('/[A-Z ]+/', 'X', $tekst);
// $resultaat is nu "deXkrollen van de trap"
Hierbij is het deel tekst dat gevonden wordt " KAT KRABT DE ", en heel dit deeltje tekst wordt vervangen door "X".
Aantal keer dat er vervangen moet wordenWe kunnen kiezen hoeveel keer er maximaal vervangen mag worden.Perl:
In perl wordt er standaard maar 1 keer vervangen. Dat wil zeggen: er wordt in de string gezocht naar waar het patroon voorkomt, en het deeltje tekst uit de string dat overeenkomt met het patroon wordt vervangen. Daarmee is de kous af.In perl is er de modifier /g waarmee we opgeven dat hij zoveel mogelijk keer moet vervangen. Dat wil zeggen: als het patroon gevonden is, wordt die vervangen. Dan wordt er verder gezocht in de string naar waar het patroon nog eens voorkomt. Wordt dat gevonden, wordt dat deeltje tekst dat overeenkomt met het patroon vervangen, en wordt er verdergezocht naar waar het patroon nog eens voorkomt in de tekst. Dit gebeurt tot overal waar het patroon in de tekst voorkomt is vervangenBijvoorbeeld: dit verandert het eerstgevonden teken "a" door een "X":
$tekst = "De kat krabt de krollen van de trap"; $tekst =~ s/a/X/; # $tekst is nu "De kXt krabt de krollen van de trap"En dit verandert alle a's door X'en: $tekst = "De kat krabt de krollen van de trap"; $tekst =~ s/a/X/g; # $tekst is nu "De kXt krXbt de krollen vXn de trXp"Nog een leuk voorbeeld: $tekst = "De kat krabt de krollen van de trap"; $tekst =~ s/./X/g; # $tekst is nu "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" PHP: In PHP wordt er stardaard zo veel keer het patroon dat in de string voorkomt vervangen als het patroon voorkomt in de string. We kunnen dit beperken door als vierde argument mee te geven hoeveel keer het patroon gezocht-en-vervangen mag worden.Dit voorbeeld verandert alle a's in X'en:
$tekst = "De kat krabt de krollen van de trap";
$resultaat = preg_replace ('/a/', 'X', $tekst);
// $resultaat is nu "De kXt krXbt de krollen vXn de trXp"
En in het volgende voorbeeld veranderen we er maximum 2:
$tekst = "De kat krabt de krollen van de trap";
$resultaat = preg_replace ('/a/', 'X', $tekst, 2);
// $resultaat is nu "De kXt krXbt de krollen van de trap"
Nog een leuk voorbeeld is dit:
$tekst = "De kat krabt de krollen van de trap";
$resultaat = preg_replace ('/./', 'X', $tekst);
// $resultaat is nu "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"$resultaat = preg_replace ('/./', 'X', $tekst, 12);
// $resultaat is nu "XXXXXXXXXXXX de krollen van de trap";
Geëxtraheerde deeltjes tekst plakkenStel, we hebben een string met een datum in dit formaat: "DD-MM-YYYY UU:MM:SS", en we willen dit omzetten naar het veel handigere formaat "YYYY-MM-DD-UU-MM-SS", dan kunnen we dat natuurlijk zo doen:Perl:
$tijd = "11-02-2005 13:30:07";
if ($tijd =~ /\A(\d{1,2})-(\d{1,2})-(\d{2,4})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})\Z/){
$tijd = "$3-$2-$1-$4-$5-$6";
}else{
die ("Datum is in een ongeldig formaat.\n");
}
PHP:
Dit kan veel makkelijker op de volgende manier:
$tijd = "11-02-2005 13:30:07";
if (preg_match ('/\A(\d{1,2})-(\d{1,2})-(\d{2,4})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})\Z/', $tijd, $matches){
$tijd = "$matches[3]-$matches[2]-$matches[1]-$matches[4]-$matches[5]-$matches[6]";
}else{
exit ("Datum is in een ongeldig formaat.");
}
Perl:
$tijd = "11-02-2005 13:30:07";
if ($tijd !~ s/\A(\d{1,2})-(\d{1,2})-(\d{2,4})\s+(\d{1,2}):(\d{1,2}):(\d{1-2})\Z/$3-$2-$1-$4-$5-$6/){
die ("Datum is in een ongeldig formaat.\n");
}
print ("$tijd\n");
PHP:
$tijd = "11-02-2005 13:30:07";
$tijd = preg_replace ('/\A(\d{1,2})-(\d{1,2})-(\d{2,4})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})\Z/', '$3-$2-$1-$4-$5-\\$6', $tijd);
echo ($tijd);
Merk hier op dat er $1 wordt gebruikt voor het eerste gevonden deeltje tekst tussen haakjes, $2 voor het tweede, etc. Er kan ook \1, \2, enz gebruikt worden.
|
| Copyright (C) 2001-2006 Willem Penninckx | |