Avatar billede netrotten88 Nybegynder
11. januar 2007 - 16:57 Der er 9 kommentarer og
1 løsning

Problemmer med str_replace

Hej experter

jeg bruger denne kode i min tagwall

$text = str_replace("chat", "<a href="link">chat</a>", $text);

Men problemmer er at hvis folk skriver fx. chatten linker den en del af ordert hvordan laver jeg sådan at str_replace kun bliver artiv hvis der er mellem rum for eller bag ved ordert eller slet igen ting

Håber i forstå problemmet ;-)
Avatar billede phliplip Nybegynder
11. januar 2007 - 17:01 #1
$text = str_replace(" chat ", "<a href="link">chat</a>", " ".$text." ");
Avatar billede phliplip Nybegynder
11. januar 2007 - 17:02 #2
Hovsa.. der skal lige huskes mellemrum i linket også;

$text = str_replace(" chat ", " <a href="link">chat</a> ", " ".$text." ");
Avatar billede netrotten88 Nybegynder
11. januar 2007 - 17:45 #3
Ja det har jeg prøvet men hvis folk så bare skriver "chat" unden mellem rum virker det ikke derfor søger jeg en kode som kun hvirker hvis der er mellem rum eller slet igen ting er i starten og slutningen af odert
Avatar billede phliplip Nybegynder
11. januar 2007 - 19:39 #4
Det gør den også! Derfor jeg har sikkret mig at der er mellemrum i starten og i slutning af den string du vil replace på! Prøv nu mit eksempel!
Avatar billede netrotten88 Nybegynder
11. januar 2007 - 19:48 #5
Det ved jeg godt har selv prøvet inde jeg spurte her inde men hvis en bruger kun skriver fx

chat

er der ikke nogen mellem rum i starten og slutningen derfor bliver kode ikke artiv og det er det der er mig problem
Avatar billede 3xm Nybegynder
11. januar 2007 - 23:33 #6
For at lave den slags "avancerede" ting skal du bevæge dig ind i en helt ny verden, kaldet Regulere Udtruk (eller Regular Expressions - eller simpelthen bare RegEx).

Det er en ting der ikke kun findes i PHP, men i de fleste sprog - faktisk er det et sprog for sig selv, og har også sin egen kategori her på exp: http://www.eksperten.dk/spm/Programmering/RegExp/

Det kan godt virke som volapyk til at starte med, men den tid du investerer i at forstå det er virkeligt givet godt ud. Det er et utroligt kraftfuldt værktøj.

Helt konkret skal du have fat i funktionen preg_replace() - http://dk2.php.net/manual/en/function.preg-replace.php

Men læs mere om regex i PHP her: http://dk2.php.net/manual/en/ref.pcre.php

Der findes en masse guides til at lære regex på nettet. Du kan jo google dig frem og finde en du synes er god.: http://www.google.dk/search?&q=regular%20expressions

Den guide der åbnede mine egne øjne var den her: http://www.phpbuilder.com/columns/dario19990616.php3
Avatar billede 3xm Nybegynder
11. januar 2007 - 23:50 #7
Jeg har lavet et eksempel du kan bruge. Se resultatet her: http://mmm.omnidrom.dk/exp/755439.php
og kilden her: http://mmm.omnidrom.dk/exp/755439.phps

og 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.
*/

?>
Avatar billede phliplip Nybegynder
12. januar 2007 - 01:37 #8
RottenLotte: Det forstår jeg ingen ting af :-S

Mit eksempel siger explicit at der SKAL være " " mellemrum foran og bagved den $text der forsøges at replace på!

[...], " ".$text." ");

$text = trim(str_replace(" chat ", " <a href="link">chat</a> ", " ".$text." "));

Men jeg er så afgjort enig med 3xm at (Perl)RegEx er vejen frem, det er bare mig der ikke lige tænkte den tanke.. Selvom jeg sidder og arbejder med RegEx hver/hveranden dag når vi screenscraper ude på arbejde ;-S My mistake!
Avatar billede netrotten88 Nybegynder
13. januar 2007 - 00:32 #9
okay 3xm smid et svar
Avatar billede 3xm Nybegynder
14. januar 2007 - 12:27 #10
=)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester