Avatar billede rthuls Nybegynder
21. oktober 2004 - 07:53 Der er 9 kommentarer og
3 løsninger

spm ang. ereg_replace

Jeg bruger følgende linie til at highlighte nogle ord i en streng:

$s = ereg_replace($q, "<span class=\"highlight\">" .  $q . "</span>", $s);


Er det overstående caseinsensitive? Og hvis det ikke er, hvordan laver man det så?

Er det den hurtigste måde at gøre det på, eller kan det gøres hurtigere med preg_replace(), str_replace() eller en helt tredje?
Avatar billede jensgram Nybegynder
21. oktober 2004 - 08:25 #1
jeg ville bruge:

preg_replace('/' . $u . '/i', '<span class="highlight">\\0</span>', $s);
Avatar billede jensgram Nybegynder
21. oktober 2004 - 08:28 #2
Kender dog ikke til performance, men det smarte ved at bruge back-references (ex: \\0) er, at man så indsætter det der lige blev fundet:

ex:

$s = 'jeg spiser ILd og iLd';
$u = 'ild';

=>

'jeg spiser <span class="highlight">ILd</span> og <span class="highlight">iLd</span>'
Avatar billede erikjacobsen Ekspert
21. oktober 2004 - 08:48 #3
Dit $q er jo næppe et regulært udtryk, så derfor vil str_replace være hurtigst.
Men den er case-sensitiv. I PHP5 kan du bruge str_ireplace til ikke case sensitiv.

Skal du erstatte hele ord, fx "abe" som ikke må være del af et andet ord, "abekat",
så skal vi over i regulære udtryk.
Avatar billede jensgram Nybegynder
21. oktober 2004 - 09:02 #4
Erik > Ja, men så får han ikke fordel af back-references (det skriver han selvfølgelig heller ikke at han vil have ;))

Jeg foretrækker det dog, hvis det eksempelvis er i forbindelse med en søge-algoritme, hvos man ikke vil lade brugeren ændre kapitalærer i den oprindelige tekst, men bare vil highlighte resultater... (Det er du selvfølgelig helt med på, Erik, jeg ville bare være sikker på, at spørger også var)
Avatar billede rthuls Nybegynder
21. oktober 2004 - 09:55 #5
jensgram >> din preg sætning virker jo fornemt. Og du har fuldstændigt ret i at det skal bruges i "forbindelse med en søge-algoritme, hvos man ikke vil lade brugeren ændre kapitalærer i den oprindelige tekst, men bare vil highlighte resultater"

Hvad er det smarte ved back-references? Det virker umidelbart lige så let at benytte $q

Hvad nu, som erikjacobsen er inde på, hvis ordet ikke må være del af et andet ord?

F.eks.
jeg spiser ILd og iLd og mereIld
Avatar billede coderdk Praktikant
21. oktober 2004 - 11:17 #6
Den case-insensitive version af ereg_replace er eregi_replace.
Som Erik skriver, hvis du vil undgå at highlighte mantis når du ville highlighte tis, bør du bruge et regulært udtryk.
Jeg foretrækker PCRE, altså preg_* funktionerne :) Den ville vist se ud lidt a la:
$q = preg_replace( "/\b$q\b/mi", '<span class="highlight">\\0</span>', $q );
Avatar billede Slettet bruger
21. oktober 2004 - 12:21 #7
Det er nok en god ide at sørge for at escape $q før den bruges. Og så skulle de to $q i coderdks kode vist være $s.

$q=preg_quote($q);
$s = preg_replace( "/\b$q\b/mi", '<span class="highlight">\\0</span>', $s );
Avatar billede Slettet bruger
21. oktober 2004 - 12:23 #8
Og ifølge manualsiderne om ereg-funktionerne er preg-funktionerne normalt hurtigere.
Avatar billede jensgram Nybegynder
21. oktober 2004 - 16:50 #9
preg_replace('/(^| )' . $u . '([ \.]|$)/i', '<span class="highlight">\\0</span>', $s);

Burde match start eller mellemrum efterfulgt af $u (som jo evt. skal escapes) efterfulgt af et mellemrum, punktum eller slutningen af strengen...

Udtrykket er case-insensitive!
Avatar billede rthuls Nybegynder
02. november 2004 - 08:05 #10
Hov, en lille forglemmelse fra min side. coderdk og sandbox vil i lægge svar?
Avatar billede Slettet bruger
02. november 2004 - 08:44 #11
Jo, her er mit.
Avatar billede coderdk Praktikant
02. november 2004 - 09:18 #12
Jada!
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