Avatar billede henninghabor Nybegynder
10. oktober 2006 - 22:31 Der er 13 kommentarer og
1 løsning

Replace på HELE ord

Hej,

Hvordan laver jeg nedenstående, så den kun erstatter hele ord.

Eksempel:

Jeg spiste is i Italien.

Hvis jeg så vil erstatte i med <span style="color: #F00;">i</span> skal den kun erstatte i mellem is og Italien, men ikke i'erne i is og Italien.
Avatar billede henninghabor Nybegynder
10. oktober 2006 - 22:32 #1
og selvfølgelig heller ikke i spiste... :)
Avatar billede gider_ikke_mere Nybegynder
11. oktober 2006 - 00:02 #2
$tekst = str_replace(" i ", " <span style="color: #F00;">i</span> ", $tekst);
Avatar billede henninghabor Nybegynder
11. oktober 2006 - 00:15 #3
Hvad så hvis ordet er i starten eller slutningen af linien?
Avatar billede gider_ikke_mere Nybegynder
11. oktober 2006 - 00:36 #4
Den var værre. Ved længere ord kan du gøre således:
$tekst = str_replace(" langtord ", " <span style="color: #F00;">langtord</span> ", $tekst);
$tekst = str_replace("langtord ", " <span style="color: #F00;">langtord </span> ", $tekst);
$tekst = str_replace(" langtord", " <span style="color: #F00;"> langtord</span> ", $tekst);
Husk at den med mellemrum på begge sider skal komme først.

Ved korte ord som blot i er du nok nødt til at lave en forespørgsel:
IF (substr($datostreng,0,2) == "i "), og så slette de to første tegn fra variablen og sætte den sammen med din span tekst igen. Det samme for slutningen.
Avatar billede henninghabor Nybegynder
11. oktober 2006 - 00:55 #5
Hvis man kan gøre sådan: preg_split("/[\s,]+/", $page);

Kan man så ikke lave en preg_replace der bruger nogenlunde samme metode?
Avatar billede gider_ikke_mere Nybegynder
11. oktober 2006 - 01:22 #6
Jeg er ikke PHP nørd :-) Du burde kunne gøre det på din måde, så skal du vel bare løbe dit array igennem og lave en søg/erstat. Men du skal vel bare splitte ved mellemrum, selvfølgelig afhængig af hvordan din tekst ser ud i databasen. Jeg mener dog min metode er mere overskuelig og sikker.
Avatar billede henninghabor Nybegynder
11. oktober 2006 - 07:51 #7
Jeg bruger preg_split'en til at splitte teksten op i ord, da de enkelte ord så skal matche i databasen.

Hvis de ikke matcher i databasen er det at den skal preg_replace. Men jeg er ret dårlig til expressions, så hvis en venlig sjæl ville hjælpe mig på vej?
Avatar billede nielle Nybegynder
11. oktober 2006 - 08:19 #8
Ved at bruge \b i et regulært udtryk fortæller man regexp-motoren at der kun skal matches på enderne af et ord (\b = "word boundary"):

$tekst = preg_replace("/\bi\b/", "XXX", $tekst);
Avatar billede nielle Nybegynder
11. oktober 2006 - 08:21 #9
Altså:

$tekst = preg_replace("/\bi\b/i", "<span style=\"color: #F00;\">i</span>", $tekst);

- eller:

$tekst = preg_replace("/\b(i)\b/i", "<span style=\"color: #F00;\">\\1</span>", $tekst);
Avatar billede henninghabor Nybegynder
11. oktober 2006 - 10:30 #10
Jeg får følgende fejlmeddelse:

Warning: preg_replace() [function.preg-replace]: Compilation failed: missing ) at offset 10

Her er min replace:

$page = preg_replace("/\b($word)\b/i", "<span style=\"color: #F00;\">\\1</span>", $page);
Avatar billede coderdk Praktikant
11. oktober 2006 - 13:52 #11
Det er bedst at køre den igennem preg_quote:

$page = preg_replace("/\b(" . preg_quote($word,"/") . ")\b/i", "<span style=\"color: #F00;\">\\1</span>", $page);
Avatar billede henninghabor Nybegynder
13. oktober 2006 - 10:39 #12
nielle's og coderdk's løsninger hjalp mig. Vil I ha' points?
Avatar billede coderdk Praktikant
13. oktober 2006 - 10:44 #13
Nah, det er nielle's :) Jeg anbefalede bare brugen af preg_quote :)

Svar nielle :)
Avatar billede nielle Nybegynder
15. oktober 2006 - 18:19 #14
Svar :^)
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