2014-02-26 10 views
11

ich in html bekam das folgende Konstrukt:Warum stimmt das Javascript String-Leerzeichen   nicht überein?

<div id="text"> 


     some&nbsp;text 


    </div> 

Wenn ich den Text und testen Sie es mit trimmen:

$("#text").text().trim() === "some text" 

es gibt false zurück auch

$("#text").text().trim() === "some&nbsp;text" 

false zurück aber

/^some\s{1}text$/.test($("#text").text().trim()) 

gibt True zurück. Also bitte sag mir, was ist hier falsch.

Wie Sie vorschlagen würden, verwende ich jQuery (1.6).

+0

'/^some\s{1}text$/.test("some   Text ".trim())' '' '' 'kehrt für mich zurück. http://jsfiddle.net/JamesD/m9TXr/ –

+0

wie in den Antworten beschrieben, müssen Sie es über jQuery analysieren. – alpham8

+0

Weil das nicht "der JavaScript String Whitespace Character" ist. –

Antwort

20

Das ist, weil die kein Leerzeichen (charCode 160) nicht exakt gleich Raum (charCode 32)

des jquery .text() codiert HTML-Entitäten in ihrer direkten Unicode Äquivalenz, und so &nbsp; wird String.fromCharCode(160)

Sie können lösen es durch replaceing die alle Nicht-Bruchflächen mit gewöhnlichen Räumen:

d.text().replace(String.fromCharCode(160) /* no breaking space*/, 
     " " /* ordinary space */) == "some text" 

oder besser noch:

d.text().replace(/\s/g /* all kinds of spaces*/, 
     " " /* ordinary space */) == "some text" 
+0

nicht wirklich, was ich eine feste Zahl statt Schlüsselkonstante verwenden wollte, aber es ist ok und macht seine Arbeit. – alpham8

+0

Anstatt die spezifische '160' zu verwenden, könnten Sie '$ ('# text') verwenden. Text(). Trim(). Replace ($ ('') .text()," ")' Offensichtlich würden Sie den '$ ('') .text()' Teil zwischenspeichern - das würde unterstützen, was auch immer verschiedene Browser und jQuery jetzt und in Zukunft mit ' ' tun würden. Das heißt, Ihr zweites Beispiel mit RegExp ist viel besser .. vor allem, da es mehrere Ersetzungen unterstützt. – Pebbl

+0

Diese Regex ist nicht allumfassend. Ich tat dies: 'var htmlString = $ myField.text(). Replace (/ \ s/g," ");' in dem Bemühen, alle Leerzeichen zu entfernen. Stattdessen war das Leerstellenzeichen 8203 mit der Leerstelle immer noch da und verursachte, dass 'htmlString.length' als 1 gelesen wurde. Sie müssen wahrscheinlich auch dieses ersetzen. – vapcguy

3

Es berücksichtigt nicht die '\ n', die unsichtbar sind. Entferne das '\ n' und überprüfe es mit '=='.

Probieren Sie diese

var x = $("#text").html(); 
      x = x.replace(/(\r\n|\n|\r)/gm, ""); 
      x = x.replace(/\s+/g, ''); 
      alert(x); 

      if (x == 'some&nbsp;text') { 
       alert('true'); 
      } 
      else { 
       alert('false'); 
      } 

Hoffnung, das hilft.

+0

@ alpham8: habe auch einen Code hinzugefügt. Sie können es auch verkürzen. lassen Sie mich wissen, ob es hilfreich war oder ob Sie irgendwelche Zweifel haben. Im Idealfall können Sie sowohl Leerzeichen als auch \ n in einem .remove() entfernen. –

2

Es gibt ein paar ähnliche Fragen. Sie könnten sie überprüfen.

Matching jquery .text() to &nbsp; nonbreaking space

Wie in den vorherigen Stellen erwähnt. Sie könnten mit "==" anstelle von "===" vergleichen und "\ xa0" zum Vergleichen von &nbsp; verwenden, was das tatsächliche Zeichen für nicht brechenden Speicherplatz ist.

12

&nbsp; ist nicht dasselbe wie das Leerzeichen (Unicode U + 0020). Es ist ein geschütztes Leerzeichen, das in Unicode als U + 00A0 codiert ist. Dies ist der Grund, warum der erste Ihrer Tests nicht übereinstimmt, der dritte jedoch; \s stimmt mit allen Leerzeichen überein.

Entweder bleiben Sie bei Ihrem regulären Ausdruck Test, oder verwenden Sie \u00a0 oder \xa0 in Ihrer Gleichheitsprüfung:

$("#text").text().trim() === "some\xa0text"; 
$("#text").text().trim() === "some\u00a0text"; 
Verwandte Themen