Regex: Geen verschil Klein en Groot

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

GreatSlovakia

GreatSlovakia

30/12/2005 19:31:00
Quote Anchor link
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.
Gewijzigd op 30/12/2005 19:33:00 door GreatSlovakia
 
PHP hulp

PHP hulp

24/11/2024 13:52:04
 
Onbekend onbekend

onbekend onbekend

30/12/2005 19:44:00
Quote Anchor link
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?
 
Jan Koehoorn

Jan Koehoorn

30/12/2005 19:47:00
Quote Anchor link
preg_replace kent geen case insensitive variant. Je zou beter met eregi_replace kunnen werken volgens mij
 
Burdy

Burdy

30/12/2005 19:52:00
Quote Anchor link
Je kunt in een preg_replace toch met de schakel /i werken? Dus zoiets als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>


Overigens, wat is de betekenis van het # in de code? Wat doet die precies?
 
Jan Koehoorn

Jan Koehoorn

30/12/2005 19:54:00
Quote Anchor link
@ Burdy: klopt! was ik vergeten. Bij preg mag dat zo.
 
Burdy

Burdy

30/12/2005 19:56:00
Quote Anchor link
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?
 
Martijn B

Martijn B

30/12/2005 20:03:00
Quote Anchor link
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?
Gewijzigd op 30/12/2005 20:05:00 door Martijn B
 
Burdy

Burdy

30/12/2005 20:16:00
Quote Anchor link
@ Martijn: wil jij onderstaande code eens uitproberen? Ik krijg daar een heel vreemd resultaat uit.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>";
?>
 
Willem vp

Willem vp

30/12/2005 20:23:00
Quote Anchor link
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).
 
Burdy

Burdy

30/12/2005 20:27:00
Quote Anchor link
Ja, heel duidelijk, bedankt Willem!
Het # is dus alleen de zelf gekozen delimiter.
Dat gaat heel wat backslashes in mijn code schelen ;)
 
Willem vp

Willem vp

30/12/2005 20:30:00
Quote Anchor link
@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.
 
Burdy

Burdy

30/12/2005 21:02:00
Quote Anchor link
Met het 'vreemde resultaat' bedoelde ik eigenlijk dat er niet het resultaat optrad zoals dat in de oorspronkelijke vraag aangegeven werd.

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.
 
GreatSlovakia

GreatSlovakia

30/12/2005 22:50:00
Quote Anchor link
Nou: hoe dan ook is het me nu eindelijk gelukt.

(P.S. Zelf vond ik de volgende Tutorial best handig dus plaats ik hem maar hier: http://www.phpfreaks.com/tutorials/52/0.php)
 
Burdy

Burdy

31/12/2005 00:01:00
Quote Anchor link
Mooi! Wil je de oplossing hier ook posten?
Goeie link trouwens.
 
GreatSlovakia

GreatSlovakia

31/12/2005 00:22:00
Quote Anchor link
Fout!!! Ik dacht dat het werkte, maar merk net dat het toch niet werkt :( :
$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.
 
Erik Rijk

Erik Rijk

31/12/2005 01:44:00
Quote Anchor link
gewoon str_ireplace gebruiken?

dat is case sensitive

dus AlpHA & aLPha is hetzelfde
 
Burdy

Burdy

31/12/2005 09:19:00
Quote Anchor link
Wil je het volgende voorbeeld proberen?

Ik heb $contents gevuld met een teststring, maar die komt misschien niet helemaal overeen met de string die je zelf gebruikt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
 
GreatSlovakia

GreatSlovakia

31/12/2005 09:58:00
Quote Anchor link
@Burdy: Bij dat voorbeeld van jouw staat $contents totaal leeg.
@Erik: Hij is niet case insensitive in Options.
 
Mitch X

Mitch X

31/12/2005 10:08:00
Quote Anchor link
Waarom gebruik je # als die ook al in je expressie voorkomt?
Dat is dan een stuk minder handig dan // ;)
 
Burdy

Burdy

31/12/2005 10:15:00
Quote Anchor link
GreatSlovakia:
@Burdy: Bij dat voorbeeld van jouw staat $contents totaal leeg.
@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.
 
Willem vp

Willem vp

31/12/2005 13:52:00
Quote Anchor link
Als je wilt dat hij case insensitive matcht, moet je een i achter de laatste regexp-delimiter zetten. Dus iets als:

preg_replace("@moeilijke-regexp@i", "blabla", $contents);
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.