Felix Riesterer: Webkit und String.replace()

Liebe JavaScriptler,

ich verwende eine trim()-Funktion, die in ihrer Funktionalität an PHP angelehnt ist. Dabei sollen unter Anderem sowohl Leerzeichen (ASCII-Code 32), als auch geschützte Leerzeichen (ASCII-Code 160) entfernt werden. Das sieht bei mir so aus:

if (typeof(new String().trim) != "function") {  
    String.prototype.trim = function () {  
        var ltrim = new RegExp("^[" + String.fromCharCode(32) + String.fromCharCode(160) + "\t\r\n]+", "g");  
        var rtrim = new RegExp("[" + String.fromCharCode(32) + String.fromCharCode(160) + "\t\r\n]+$", "g");  
  
        s = this.replace(ltrim, "");  
        s = s.replace(rtrim, "");  
  
        return s;  
    }  
}

In den von mir getesteten Browsern (FF, IE, Opera) ergibt obiger Code das gewünschte Ergebnis - bis auf Webkit-basierte Browser (Safari, Google Chrome). Dort wird das geschützte Leerzeichen _nicht_ entfernt.

Beispiel:
javascript:alert("'" + String.fromCharCode(160).trim() + "'")

Obige Zeile in der Adresszeile des Browsers eingegeben ergibt z.B. in Safari
folgende Ausgabe: ' '

Warum ist das so und wie erhalte ich ein sicheres Entfernen dieses geschützten Leerzeichens?

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. n'abend,

    Warum ist das so und wie erhalte ich ein sicheres Entfernen dieses geschützten Leerzeichens?

    \s findet jede Art von Weißraum-Zeichen ("Whitespace"), also \f, \n, \t, \v und das Leerzeichen (Absatz: Syntax regulärer Ausdrücke). Auch stellt sich mir die Frage was passiert, wenn du bis zur ersten Wortgrenze \b abschneidest.

    weiterhin schönen abend...

    --
    #selfhtml hat ein Forum?
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. Lieber globe,

      auch \s im Suchmuster wird in Webkit anscheinend nicht auf ein geschütztes Leerzeichen gematched. Folgender Code ist im Grunde äquivalent zu meinem vorherigen Posting:

      if (typeof(new String().trim) != "function") {  
          String.prototype.trim = function () {  
              s = this.replace(/^\s+/g, "");  
              s = s.replace(/\s+$/g, "");  
        
              return s;  
          }  
      }
      

      Trotzdem führt diese Zeile

      javascript:alert("'" + String.fromCharCode(160).trim() + "'")

      in Webkit-Browsern nach wie vor zu folgender Ausgabe: ' '

      Auch stellt sich mir die Frage was passiert, wenn du bis zur ersten Wortgrenze \b abschneidest.

      Und mir stellt sich die Frage, wie Du das in einem regulären Suchmuster notieren willst.

      weiterhin schönen abend...

      Huch? Morgens um 8:04 Uhr noch immer nicht zu Bett gegangen?

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hallo Felix

    Nur zur Info:

    Dein trim funktioniert bei mir in Safari Win XP, Version 3.1 (525.13.3) und in Safari Leopard, Version 3.1.2 (5525.20.1)

    Claudia

    1. Liebe claudia,

      bist Du auch 100%ig sicher, dass mit dem trim() führende (oder nachfolgende) geschützte Leerzeichen (String.fromCharCode(160)) sicher entfernt werden? Ein String, der nur aus einem solchen besteht, sollte in einen Leerstring umgewandelt werden - was es bei mir weder im Google Chrome (von gestern), noch im Safari 3.1.2 (525.21) unter meinem XP tut.

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hallo Felix

        Ja ich bin mir sicher. Um sicherzustellen, dass ich keinen Sehfehler habe, habe ich das Beispiel-alert einmal mit und einmal ohne dein trim() ausgefuehrt und kann definitv sagen, dass dein trim() das Leerzeichen entfernt.

        Hier sicherheitshalber meine Testseite

        Claudia

        1. Ganz vergessen

          Ich habe meinen XP-Safari auf 3.2.1 (525.21) aktualisiert und es funktioniert immer noch.

          Claudia

          1. Liebe Claudia,

            ganz herzlichen Dank! Deine Hartnäckigkeit hat mir geholfen meinen Fehler zu finden. Ich hatte zweierlei prototypische trim-Erweiterungen in meinem Script. Da es knapp 2800 Zeilen Code hat, habe ich das übersehen...

            Du hattest von Anfang an Recht, und ich konnte meine Fehler beseitigen.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. Moimon.

    Deine Regexpe sehen gut aus und tun bei mir auch genau das erwünschte. Auch unter Safari 3.1 / XP.

    Um dem bei Dir auftretenden Verhalten näher zu kommen, würde ich zunächst mal nen Match Regexp aufbauen und auf nen Teststring anwenden...
    Oder von nem Teststring mal per charCodeAt Vergleichswerte ausgeben lassen...

    Grüße

  4. Vielen Dank an alle, die mir geholfen haben. Mittlerweile war mein Problem auf eine doppelte prototypische Erweiterung der trim-Methode zurückzuführen, die ich in den knapp 2800 Codezeilen übersehen hatte.

    Problem gelöst.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)