Toon posts:

Javascript replace '&' -> '&' in string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil in een string (javascript: document.location) de "&" tekens vervangen door "&" in javascript.

Javascript code:

code:
1
2
3
4
5
6
7
8
9
10
11
function replaceIt(string,search,replace) {
    out = "" + string;
    
    while (out.indexOf(search)>-1) {
        pos= out.indexOf(search);
        out = "" + (out.substring(0, pos) + replace +
        out.substring((pos + search.length), out.length));
    }
    
    return out;
}


Als ik alleen probeer "&" wil replacen met "&" dan gaat IE CPU gebruik naar 100%.
Weet iemand oplossing?

  • CrashOne
  • Registratie: Juli 2000
  • Niet online

CrashOne

oOoOoOoOoOoOoOoOoOo

Misschien is het makkelijker om met een regular expression te doen:

http://www.google.com/sea...start=0&ie=utf-8&oe=utf-8

Huur mij in als freelance SEO consultant!


Verwijderd

1: Schrijf je altijd liever zelf functies dan dat je even in een reference guide kijkt of er niet al een functie voor bestaat?

2: Waarom wil je die replace uberhaupt uitvoeren?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

een regexp:
JavaScript:
1
var replaced = window.location.href.replace(/&/g, '&');


oh ja: je zit in het verkeerde forum, clientside javascript hoort in Webdesign & Graphics

[ Voor 49% gewijzigd door crisp op 05-09-2003 19:35 ]

Intentionally left blank


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 21-08 19:22
Logisch dat-ie naar 100% gaat: je zoekt steeds het eerste voorkomen van & in je string en vervangt dat door &. Vervolgens zoek je weer naar het eerste voorkomen, en waar zit dat? Juist, in je net aangepaste stukje... Hij blijft dus steeds hetzelfde doen.

Je kan ofwel met regexps werken, zoals CrashOne al zegt, ofwel, makkelijker maar minder netjes, de string karakter voor karakter doorlopen en dan wijzigen.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Who is John Galt?


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
RegExpes zijn overkill in dit geval, aangezien er geen complexe string vervangen moet worden. Replace is efficienter.
JavaScript:
1
2
3
    var myString = 'Bert & Ernie';
    alert(myString);
    alert(myString.replace('&', '&'));

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

bigtree schreef op 05 september 2003 @ 19:44:
RegExpes zijn overkill in dit geval, aangezien er geen complexe string vervangen moet worden. Replace is efficienter.
JavaScript:
1
2
3
    var myString = 'Bert & Ernie';
    alert(myString);
    alert(myString.replace('&', '&'));
Het 1e argument van de replace method is een regexp; in het geval dat je daar, zoals in jouw voorbeeld, een string neerzet, dan zal die eerst door de regexp constructor worden gehaald.

Aanschouw trouwens het volgende:

JavaScript:
1
2
3
var s = 'blabla';
alert(s.replace('a', 'o')); // blobla
alert(s.replace(/a/g, 'o')); // bloblo

[ Voor 3% gewijzigd door crisp op 05-09-2003 20:42 ]

Intentionally left blank


Verwijderd

Maar goed, er is weinig reden te verzinnen om & in window.location.href te plaatsen.

[ Voor 11% gewijzigd door Verwijderd op 05-09-2003 20:48 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 05 September 2003 @ 20:47:
Maar goed, er is weinig reden te verzinnen om & in window.location.href te plaatsen.
urlencoden kan ik me nog iets bij voorstellen, en idd het is document.URL (readonly) of window.location.href ;) (je had al ge-edit zie ik)

[ Voor 5% gewijzigd door crisp op 05-09-2003 20:50 ]

Intentionally left blank


Verwijderd

Topicstarter
Bedankt voor jullie posts, heb uiteindelijk maar een nieuwe functie geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function replaceAndSign(myString) {
    var pos = 0
    find = '&';
    replace = '&';
    completestring = '' + myString;
    while (pos < completestring.length) {
      if (completestring.substring(pos,pos+1) == find) {
            completestring = '' + (completestring.substring(0, pos) + replace +
            completestring.substring((pos + find.length), completestring.length));
            pos = pos + (replace.length - find.length);
        }
        pos = pos + 1;
    }
    return completestring;
}


Deze loopt door de string heen, caracter voor caracter en replaced de & met een &.
Werkt uitstekend.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 06 september 2003 @ 17:08:
Bedankt voor jullie posts, heb uiteindelijk maar een nieuwe functie geschreven:
[...]
Deze loopt door de string heen, caracter voor caracter en replaced de & met een &.
Werkt uitstekend.
Waarom toch niet een reguliere expressie?

Intentionally left blank


Verwijderd

Een leuke oefening, dat zeker, maar waarom niet gewoon met String.replace()? Ik durf te betwijfelen dat jouw oplossing een performance-toename tot gevolg heeft.

  • CrashOne
  • Registratie: Juli 2000
  • Niet online

CrashOne

oOoOoOoOoOoOoOoOoOo

idd, had je een kleine functie als deze:
code:
1
2
3
4
5
6
function doReplace(toDo, what, with){
var content
content = toDo;
content.replace(what,with);
return content
}


Ook veel dynamischer.

code niet getest

Huur mij in als freelance SEO consultant!


  • Croga
  • Registratie: Oktober 2001
  • Laatst online: 21-08 11:16

Croga

The Unreasonable Man

Verwijderd schreef op 06 September 2003 @ 17:08:
Bedankt voor jullie posts, heb uiteindelijk maar een nieuwe functie geschreven:

[knip monstercode weg]

Deze loopt door de string heen, caracter voor caracter en replaced de & met een &.
Werkt uitstekend.
En daarom is de uitspraak "I don't see why anyone would ever need more then 640KB of memory" teniet gedaan.......

Please, dit is écht een monster van een functie. Kijk eens naar alle adviezen die in dit topic staan, dan kun je toch wel wat beters verzinnen?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

dan zo:

JavaScript:
1
2
3
4
function doReplace(text, what, with){
  var re = new RegExp(what, 'g');
  return text.replace(re, with);
}


;)

Intentionally left blank


  • CrashOne
  • Registratie: Juli 2000
  • Niet online

CrashOne

oOoOoOoOoOoOoOoOoOo

crisp schreef op 06 September 2003 @ 17:34:
dan zo:

JavaScript:
1
2
3
4
function doReplace(text, what, with){
  var re = new RegExp(what, 'g');
  return text.replace(re, with);
}


;)
patsertje ;)

Huur mij in als freelance SEO consultant!


Verwijderd

Topicstarter
Probleem wat die replace functie heeft, is dat deze alleen de eerst gevonden & vervangt en de rest niet.

das niet de bedoeling..

[ Voor 12% gewijzigd door Verwijderd op 06-09-2003 17:55 ]


  • CrashOne
  • Registratie: Juli 2000
  • Niet online

CrashOne

oOoOoOoOoOoOoOoOoOo

Verwijderd schreef op 06 september 2003 @ 17:54:
Probleem wat die replace functie heeft, is dat deze alleen de eerst gevonden & vervangt en de rest niet.

das niet de bedoeling..
Als je had gelezen had crisp al gezegt dat:

s.replace(/a/g, 'o')

het klusje zou moeten klaren, dus neit alleen het eerst gevonden karakter.

Huur mij in als freelance SEO consultant!


Verwijderd

Topicstarter
ok.. was niet meer helemaal helder denk ik :)
Heb de Regular Expressions maar gebruikt, zal ongetwijveld wat schelen wat performance betreft...

[ Voor 53% gewijzigd door Verwijderd op 06-09-2003 18:11 ]


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Verwijderd schreef op 06 September 2003 @ 17:54:
Probleem wat die replace functie heeft, is dat deze alleen de eerst gevonden & vervangt en de rest niet.

das niet de bedoeling..
Hey dat wist ik niet (ook niet getest met meerdere & in een string, my mistake).

Dan nog lijkt deze methode mij het meest efficient:
JavaScript:
1
2
3
4
5
6
7
8
    var myString = 'Bert & Ernie & Oom Rudolf';
    var newString = '';

    for (var i = 0; i < myString.length; i++) 
        newString += (myString.charAt(i) == '&' ? '&amp;' : myString.charAt(i));

    alert(myString);
    alert(newString);
Benchmark anyone? :)

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Sure :)

50.000 keer met de tekst 'Bert & Ernie & Oom Rudolf'
CPU: AMD XP2000
OS: Win2k
Mem: 512MB

functie 1 (de jouwe dus - beetje verder geoptimaliseerd nog):

JavaScript:
1
2
3
4
5
6
7
8
function replaceIt (text, from, to) {

  for (var i = 0, j = text.length, result=''; i < j; i++) 
        result += (text.charAt(i) == from ? to : text.charAt(i));

  return result;

}


tijd: 6.169 sec

functie 2 (reguliere expressie):

JavaScript:
1
2
3
4
5
6
function replaceIt (text, from, to) {

  var re = new RegExp(from, 'g');
  return text.replace(re, to);

}


tijd: 0.551 sec

I rest my case... ;)

Intentionally left blank


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
_/-\o_ Point well taken.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1