Avatar billede ssv Nybegynder
26. januar 2010 - 18:49 Der er 5 kommentarer og
1 løsning

jQuery replace

Hej.

Jeg er blevet lidt interesseret i replace funktionen. Jeg kan se en del eksempler hvor replace er i brug, men jeg kan ikke noget sted, hvor jeg kan læse mere om, hvordan man erstatter én tekst med en anden.

Efter min tankegang, ville et eksempel være noget i retningen af:

<p>Lorem ipsum dolor sit amet</p>

$(function(){
    $('p').text().replace("Lorem","Septu");
});

Jeg kan ikke rigtig hitte ud af de eksempler jeg har fundet, da de er meget komplicerede.

Så, jeg er på udkig efter en forklaring på hvordan replace fungerer, og evt. nogle guides hvor jeg kan læse mere om dette :-)
Avatar billede wanze Nybegynder
26. januar 2010 - 19:56 #1
Du bruger sådan set replace-funktionen rigtigt nok, det er dit jQuery, den er galt med. Nu kan jeg jo ikke se, hvordan hele din kode ser ud, så har lavet et eksempel til dig for en sikkerheds skyld:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script>
  $(document).ready(function(){
    $('p').html($('p').text().replace('Lorem','Septu'));
  });
  </script>
</head>
<body>
  <p>Lorem ipsum dolor sit amet</p>
</body>
</html>


Du må sige til, hvis der er noget, du ikke forstår. Ellers kan du kigge i jQuery-dokumentationen; den er guld værd: http://docs.jquery.com/Main_Page
Avatar billede ssv Nybegynder
26. januar 2010 - 22:50 #2
Jeg har kigget godt i dokumentationen, men jeg kan ikke finde noget omkring replace.

I et eksempel fandt jeg denne variabel:

var regexp = /<("[^"]*"|'[^']*'|[^'">])*>/gi;

Hvor han brugte den således:

$(this).html().replace(regexp,"");

Jeg kan bare ikke se noget logisk i variablen - kan du prøve at forklare den i "bidder", eller kender du noget dokumentation hvor jeg kan læse mere om det?
Avatar billede wanze Nybegynder
27. januar 2010 - 00:14 #3
Nej, replace er ikke i jQuery-dokumentationen, da det er en helt almindelige Javascript-funktion. Men for at kunne bruge den bliver dit jQuery nødt til at fungere - det er det, der  var problemet før.

Hvilken del ser du ikke noget logisk ud, tænker du på: var regexp = /<("[^"]*"|'[^']*'|[^'">])*>/gi;

Det, der bruges der er en regex (regular expression), som der også står. Regex har sådan set ikke noget med JavaScript at gøre - Regex er bare en måde at søge på, der er implementeret mange steder, både i kommandolinjeværktøjer i Linux, i teksteditorer, og i et utal af programmeringssprog. Det er et kanon værktøj til at lave avanceret matchmaking/søgning; det er dog tungt.

Regex kan være rimelig kompliceret lige at gå til, men hvis du vil lære mere kan du kigge på http://www.regular-expressions.info/

Nu er jeg ikke selv ekspert til Regex, jeg kan da prøve at bryde den ned for dig.
/ bruges i starten og slutningen for at sige "nu starter selv regexen". Alt i mellem, er det den forsøger at matche. Det, der står efter (gi) er modifiers. i betyder at søgningen og case-insensitive, og g betyder at det er en global søgning (så vidt jeg husker).

Nu er der <("[^"]*"|'[^']*'|[^'">])*> tilbage, hvilket er selve udtrykket.

Strengen, den matcher, skal starte med < og slutte med >. Dog skal < og > ikke være en del, af det der returneres, når man søger. Det er kun det mellem ( og ), der skal matches. *'en efter betyder, at det, der er mellem < og > ikke skal være en specifik længde. Hvis der derimod stod . fremfor * så skulle den være et tegn, hvis der stod + skulle den være mindst ét tegn. Hvis der stod {5} skulle den være 5 tegn, {2,8} betyder mellem 2 og 8 tegn, {,9} betyder mindre end 9 tegn og {5,} betyder mere end 5 tegn, for eksempel.

Herefter kommer vi til, hvad strengen skal matche mere detaljeret. | betyder eller, dvs strengen skal matche enten <([^'">])*> eller <("[^"]*")> eller <('[^']*')>. [ og ] bruges normalt til at indramme en slags "udtryk". Det kan fx være [a-z], som betyder alle bogstaver eller [\w] betyder alle ord, osv. Du kan læse om det hele på regular-expressions.info som nævnt. ^ betyder undtagen. Dvs den matcher ikke strenge, der indeholder " eller ' eller '". Ligeledes er der en stjerne efter udtrykket her, der også betyder i alle længder.

Hvis du vil vide mere bør du nok tjekke siden ud jeg linkede - det er (som du nok allerede har opdaget) en smule omfattende.
Avatar billede intenz Novice
27. januar 2010 - 00:33 #4
Almindelig javascript replace kan du gøre sådan her:
str = 'hej med dig';
str = str.replace(/hej/, 'goddag');

Hvis du vil replace med case-insensitive (uden forskel på store/små bogstaver) kan du gøre:
str = str.replace(/hej/i, 'goddag');

Og hvis du vil replace flere gange i samme streng, kan du gøre:
str = 'hej hej med dig';
str = str.replace(/hej/g, 'goddag');

Eller samlet:
str = str.replace(/hej/ig, 'goddag');

Udover det er regular expression (som wanze fint forklarer) godt at lære, men dog noget langhåret. Regular expression er uundværligt i specielle situationer, men man skal holde tungen lige i munden. Jeg kan kode det meste, men har aldrig rigtigt forstået regular expressions (burde nok gøre få læst dokumentationen engang :p)
Avatar billede ssv Nybegynder
27. januar 2010 - 10:59 #5
Tak for svarene, begge to.

Det blev godt nok lidt for indviklet, til det jeg skal bruge det til, men det var meget rart at få det hele forklaret.

Wanze, smid et svar :-)
Avatar billede wanze Nybegynder
27. januar 2010 - 14:36 #6
Det kan garanteret også løses uden brug af regex; det er som nævnt noget ressourcetungt, hvorfor det bør undgås.

Tak for point og håber det hjalp. :)
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