Ik heb de volgende regex samengestelt welke er voor zorgt dat alfa, beta of gamma wordt verplaatst door Delta, dus:
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.
Ik ben gek op moeilijke dingen!
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
Je kunt in een preg_replace toch met de schakel /i werken? Dus zoiets als:

<?php
$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.
Ik heb ook het idee dat de originele code
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?
Je bent in de war met een "character class" met die haken "[]". Tussen "()" matched altijd letterlijk.

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?
@ Martijn: wil jij onderstaande code eens uitproberen? Ik krijg daar een heel vreemd resultaat uit.

<?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>";
?>
Even terugkomen op de # in de regexp:

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).
Ja, heel duidelijk, bedankt Willem!
Het # is dus alleen de zelf gekozen delimiter.
Dat gaat heel wat backslashes in mijn code schelen ;)
@Burdy:

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.

Reageren