Regex: Geen verschil Klein en Groot
preg_replace("#(alfa|beta|gamma)?#"," Delta ", $var);
Nu wil ik er voor zorgen dat ook aLfa, ALfa, ALFA ect. kan worden opgemerkt.
P.S. Bij mijn script staat er nog veel meer in wat ik hier niet heb gekopieert aangezien dat het alleen 10x zo moeilijk zou maken.
Gewijzigd op 30/12/2005 19:33:00 door GreatSlovakia
Zou je het er toch bij willen zetten?
^Ik zou zo uit de losse hand trouwens niet weten hoe dat met hoofd en kleine letters moet.
Van a tot zet werkt het zo: [a-zA-Z], maar of dat ook met woorden werkt?
preg_replace kent geen case insensitive variant. Je zou beter met eregi_replace kunnen werken volgens mij
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$var = "Alfa alfa aLFa beta Beta beTA gamma Gamma gaMMa";
$newvar = preg_replace("/alfa|beta|gamma/i"," Delta ", $var);
echo $newvar;
?>
$var = "Alfa alfa aLFa beta Beta beTA gamma Gamma gaMMa";
$newvar = preg_replace("/alfa|beta|gamma/i"," Delta ", $var);
echo $newvar;
?>
Overigens, wat is de betekenis van het # in de code? Wat doet die precies?
@ Burdy: klopt! was ik vergeten. Bij preg mag dat zo.
preg_replace("#(alfa|beta|gamma)?#"," Delta ", $var);
niet gaat werken.
Die vervangt, voor zover ik het zie, alle afzonderlijke letters door Delta.
@ Jan: weet jij wat het # in deze string doet?
De hekjes is om aan te geven dan er voor en achter nog meer tekst kan worden gematched.
Nu heb ik zelf ook een vraag: Is de vraagteken in de regex van "GreatSlovakia" wel nodig?
Gewijzigd op 30/12/2005 20:05:00 door Martijn B
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// originele code
$var = "Het woordje alfa ('aLFa') moet vervangen worden door Delta.";
$newvar = preg_replace("#(alfa|beta|gamma)?#"," Delta ", $var);
echo $newvar;
echo "<br>";
// aangepaste code
$var = "Het woordje alfa ('aLFa') moet vervangen worden door Delta.";
$newvar = preg_replace("/alfa|beta|gamma/i", "Delta", $var);
echo $newvar;
echo "<br>";
?>
// originele code
$var = "Het woordje alfa ('aLFa') moet vervangen worden door Delta.";
$newvar = preg_replace("#(alfa|beta|gamma)?#"," Delta ", $var);
echo $newvar;
echo "<br>";
// aangepaste code
$var = "Het woordje alfa ('aLFa') moet vervangen worden door Delta.";
$newvar = preg_replace("/alfa|beta|gamma/i", "Delta", $var);
echo $newvar;
echo "<br>";
?>
In principe wordt een regexp omsloten door //, maar als dat niet handig is, kun je in principe elk niet-alfanumeriek karakter als delimiter gebruiken (backslash uitgezonderd). De regexp engine merkt vanzelf dat je een andere delimiter gebruikt en zal zijn gedrag daaraan aanpassen.
Denk aan een regexp waarin je het pad /usr/bin/ moet vervangen door /usr/local/bin/:
preg_replace("/\/usr\/bin\//", "/usr/local/bin/", $path)
Isse nie handig. In plaats daarvan kun je gebruiken:
preg_replace("#/usr/bin/#", "/usr/local/bin/", $path)
of zelfs
preg_replace("'/usr/bin/'", "/usr/local/bin/", $path)
(énkele quotes om het nog onleesbaarder te maken ;-) )
In de perl-praktijk is het gebruikelijk om de # als delimiter te gebruiken in een dergelijk geval (tenzij de # in je regexp voorkomt).
Het # is dus alleen de zelf gekozen delimiter.
Dat gaat heel wat backslashes in mijn code schelen ;)
Het is helemaal geen vreemd resultaat, als je tenminste weet hoe een regexp werkt ;-)
In de eerste regexp staat (even vereenvoudigd)
/(alfa)?/i
Dat betekent: match de groep indien die 0 of 1 keer voorkomt. Aangezien de hele regexp dus optioneel is, matcht hij na elk karakter in de invoerstring.
Eigenlijk zou ik verwachten dat hij dit slechts 1x doet, aangezien er geen /g modifier is opgegeven (oftewel: dit gedrag zou ik verwachten bij /(alfa)?/ig) maar blijkbaar is dit een punt waarop PCRE net iets anders werkt dan "gewone" RE.
Dat vreemde resultaat werd veroorzaakt door het extra ? in de oorspronkelijke preg_replace.
Als je die weglaat werkt een en ander zoals verwacht.
Ik was echter aanvankelijk in de veronderstelling dat het veroorzaakt werd door de ().
Bedankt voor je heldere uitleg.
(P.S. Zelf vond ik de volgende Tutorial best handig dus plaats ik hem maar hier: http://www.phpfreaks.com/tutorials/52/0.php)
Goeie link trouwens.
$contents = preg_replace("#\[style=/(bgColor|fgColor|linkColor|vlinkColor)?/i\](\#([0-6a-fA-F]{6})|([a-zA-Z])*)\[/style\]#","<script type=\'text/javascript\'>document.$1 = \'$2\'</script>",$contents);
Dit is een wat minder versimpelde versie, maar het gekke is dat het volgende script wel werkt:
$contents = preg_replace("/(bgColor|fgColor|linkColor|vlinkColor)/i","COLOR",$contents);
En het enige ECHTE verschil is dat ik de hekjes heb weggelaten.
dat is case sensitive
dus AlpHA & aLPha is hetzelfde
Ik heb $contents gevuld met een teststring, maar die komt misschien niet helemaal overeen met de string die je zelf gebruikt.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$contents = "[style=bgColor #123456][/style]";
$contents = preg_replace("#\[style=(bgColor|fgColor|linkColor|vlinkColor)\s(\#[A-Fa-f0-6]{6}|[A-Za-z]*)\]\[\/style\]#","<script type=\'text/javascript\'>document.$1 = \'$2\'</script>",$contents);
echo $contents;
?>
$contents = "[style=bgColor #123456][/style]";
$contents = preg_replace("#\[style=(bgColor|fgColor|linkColor|vlinkColor)\s(\#[A-Fa-f0-6]{6}|[A-Za-z]*)\]\[\/style\]#","<script type=\'text/javascript\'>document.$1 = \'$2\'</script>",$contents);
echo $contents;
?>
@Erik: Hij is niet case insensitive in Options.
Dat is dan een stuk minder handig dan // ;)
GreatSlovakia:
@Burdy: Bij dat voorbeeld van jouw staat $contents totaal leeg.
@Erik: Hij is niet case insensitive in Options.
@Erik: Hij is niet case insensitive in Options.
Je ziet het resultaat ook niet op het scherm.
Je moet in de bron van je document kijken.
preg_replace("@moeilijke-regexp@i", "blabla", $contents);