JavaScript text.replace()

smallwall

Lt. Junior Grade
Registriert
Feb. 2014
Beiträge
446
Hallo,
hier habe ich ein Problem mit einer einfachen replace()-Funktion.

http://devphp.de/board/board2.php

pgnreplace.png

Die Funktion:
PHP:
function pgnGerman(pgn) {
    pgn = pgn.replace("Q", "D");
    pgn = pgn.replace("B", "L");
    pgn = pgn.replace("R", "T");
    pgn = pgn.replace("N", "S");
    
    return pgn;
}
Call:
PHP:
        if (cfg.pgnLanguage === 'German') {
            pgnEl.html(pgnGerman(game.pgn()));    
        } else {
            pgnEl.html(game.pgn());
        }

Wie im Bild zu sehen, funktioniert sie manchmal, aber meistens nicht. Im 4. Zug wurde der weiße Zug richtig ersetzt, der schwarze aber nicht. Im 5. Zug das gleiche, im 6. ist nichts ersetzt worden, im 9. wieder nur der weiße.

game.pgn() liefert die Züge in englischer Notation, nachdem ich meine Funktion darauf ausgeführt habe, sollte es eigentlich deutsche Notation sein. Q=Queen -> Dame, R=Rook ->Turm etc.

Was läuft dort falsch?

mfg
 
replace + stringliteral ersetzt nur das erste Auftreten innerhalb des Strings. Entweder rufst du die Funktion so oft auf wie zu ersetzende Strings enthalten sind oder arbeitest mit regulären Ausdrücken: replace(/Q/g,"D");
 
Vielen Dank. Das klappt.
In einem anderen Skript habe ich das selbe mit
PHP:
  movetextreplace = movetextreplace.replace("Q","D");
  movetextreplace = movetextreplace.replace("N","S");
  movetextreplace = movetextreplace.replace("B","L");
  movetextreplace = movetextreplace.replace("R","T");

gemacht, das hat tadellos funktioniert. Ich glaube dort werden aber die Züge einzeln geliefert, nicht als "ein großer String".

Die regulären Ausdrücke sollte ich mir noch einmal anschauen. Wofür steht das /g?

Und das erklärt aber nicht, warum manchmal gar nichts ersetzt wurde, aber später dann wieder... naja auch egal..
 
Das g ist ein sogenannter Modifier und bedeutet: global. Ohne das g würde nur das erste Auftreten ersetzt. Ein anderer Modifier ist i und steht für ignore case. Modifier können kombiniert werden: replace(/Q/ig,"D") würde sowohl kleine q als auch große Q durch D ersetzen. Wenn bei dir gar nichts ersetzt wurde hast du vielleicht einen Tippfehler gemacht oder vergessen den replace-string einer Variablen zuzuweisen. replace() ändert ja einen bestehenden String nicht, sondern erzeugt einen neuen. Siehe auch: http://www.w3schools.com/js/js_regexp.asp
 
Zurück
Oben