Jeg har lavet et eksempel du kan bruge. Se resultatet her:
http://mmm.omnidrom.dk/exp/755439.phpog kilden her:
http://mmm.omnidrom.dk/exp/755439.phpsog herunder:
<?php
// Nogle tekster
$text1 = "Her står der chat inde i teksten";
$text2 = "Chat er det første ord i denne tekst";
$text3 = "Her er det sidste ord CHAT";
$text4 = "Her står der chatten som så ikke skal erstattes af et link";
// Det mønster vi leder efter
$pattern = "/(^| )(chat)( |\$)/i";
/*
Og så dissekerer vi lige mønsteret for at forstå hvad der sker:
Et mønster starter og slutter altid med en skråstreg - derfor skal
man også huskeat escape skråstreger inde i mønsteret, ellers tror
PHP at man angiver at mønsteret er færdigt.
Det gør man som med så mange andre tegn ved at skrive "\/"
Efter mit mønster har jeg skrevet "i" - det definerer at jeg vil
matche case insensitivt, hvilket gør at både "CHAT" "cHaT" og
"chat" bliver matchet. Hvis dette ikke ønskes kan i'et bare
fjernes.
Så kommer der et sæt paranteser: "(^| )" som indeholder 3 tegn.
Vi tager dem 1 ad gangen:
^ - betyder starten af strengen
| - er en "eller"-operator - ligesom den er i PHP
- er et ganske almindeligt mellemrum.
Det der sker her er at vi siger at der skal være enten starten af
strengen eller et mellemrum.
Herefter står der "(chat)".
Så kommer et tredje sæt paranteser: "( |\$)" som igen indeholder
3 tegn. De 2 af dem kender vi: "^" og " ". Men der er også et vi
ikke er stødt på før:
$ - betyder slutningen af strengen.
Dvs. her matcher vi på at vi enten er nået til et mellemrum eller
enden på strengen.
NB: Læg mærke til at dollartegnet er escaped, da det jo er et
særligt tegn i PHP.
Hvis vi ser på sammenhængen igen har vi et mønster defineret mellem
2 skråstreger, efterfulgt af et "i" der angiver at vi er ligeglade
med store og små bogstaver.
Selve mønsteret siger at vi leder efter strenget "chat" der enten
står i starten af en streng eller har et mellemrum før sig OG at der
efter strengen enten er et mellemrum eller at strengen slutter.
Paranteserne fungerer som en slags gruppering af dele af strengen,
hvilket kommer os til gavn når vi skal angive hvad der skal
erstattes med. Hvis man ønsker at matche på paranteser skal de -
ligesom skråstregen være escaped - altså \( og \)
*/
// Det der skal erstattes med
$replace = "$1<a href=\"link\">$2</a>$3";
/*
Og så dissekerer vi lige hvad der skal erstattes med for at forstå
hvad der sker:
Her har vi en rimelig alm. PHP-streng. Bortset fra at 3 steder inde
i den står den underlige variable a la $n - hvor n er et tal.
Disse variabler refererer tilbage til vores paranteser i mønsteret.
Det er nemlig så smart at man kan genbruge dele af mønsteret igen i
det der erstattes med. Det sker ved at bruge variablerne $n. Det er
ret simpelt: $1 er indholdet af det første sæt paranteser der
optræder, $2 indholder af det andet sæt paranteser der optræder,
osv., osv.
Og med indholdet af paranteserne menes der ikke fx. "^| " for
parantes #1, men det der matches. Så hvis der er matchet et
mellemrum er værdien af $1 et mellemrum, osv. for dem alle 3.
*/
// Så erstatter vi $pattern med $replace i de 4 tekster og ser hvad der sker...
echo preg_replace($pattern, $replace, $text1);
echo "<br />";
echo preg_replace($pattern, $replace, $text2);
echo "<br />";
echo preg_replace($pattern, $replace, $text3);
echo "<br />";
echo preg_replace($pattern, $replace, $text4);
/*
PS:
Regulære udtryk kan bruge stil utroligt meget andet end lige det
her. Det er et rigtig kraftfuldt værktøj til at finde mønstre. Find
noget mere om det på Google, eller snus rundt i Ekspertens kategori
om det: <
http://www.eksperten.dk/spm/Programmering/RegExp/> Det kan godt virke svært og uforståeligt til at starte med, men tid
det tager at sætte sig ind i RegEx er givet godt ud.
*/
?>