2009-09-30 21 views
39

Przetwarzam xhtml przy użyciu javascript. Otrzymuję treść tekstową dla węzła div, łącząc wartość nodeValue wszystkich węzłów podrzędnych, gdzie nodeType == Node.TEXT_NODE.Zastępowanie   z węzła tekstowego javascript domena

Wynikowy ciąg zawiera czasami nierozdzielający obiekt spacji. Jak zastąpić to zwykłym znakiem spacji?

Moje div wygląda następująco ...

<div><b>Expires On</b> Sep 30, 2009 06:30&nbsp;AM</div>

następujące propozycje znajdują się w internecie nie działa:

var cleanText = text.replace(/^\xa0*([^\xa0]*)\xa0*$/g,""); 


var cleanText = replaceHtmlEntities(text); 

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g; 
    var translate = { 
    "nbsp": " ", 
    "amp" : "&", 
    "quot": "\"", 
    "lt" : "<", 
    "gt" : ">" 
    }; 
    return function(s) { 
    return (s.replace(translate_re, function(match, entity) { 
     return translate[entity]; 
    })); 
    } 
})(); 

jakieś sugestie?

+1

"' '&nnbsp;" Twoje dane nie jest problem ... to jest? – brianreavis

+0

Umieściłem literówkę w moim poście - Stack Overflow przekształcił encję w rzeczywistą przestrzeń w podglądzie postu, jeśli użyłem   – user158678

+0

Hej, wygląda jak literówka w nazwie funkcji. Zobacz edycję mojego pytania. – Kip

Odpowiedz

90

To jest znacznie łatwiejsze niż robisz. Węzeł tekst nie będzie miał dosłowne ciąg "&nbsp;" w nim, to będzie mieć mieć odpowiedni charakter z kodem 160.

function replaceNbsps(str) { 
    var re = new RegExp(String.fromCharCode(160), "g"); 
    return str.replace(re, " "); 
} 

textNode.nodeValue = replaceNbsps(textNode.nodeValue); 

UPDATE

Jeszcze prościej

textNode.nodeValue = textNode.nodeValue.replace(/\u00a0/g, " "); 
+1

dzięki. to działało i okazało się łatwiejsze niż ja to robiłem :) – user158678

+0

Wspaniałe - okrzyki na napiwki. –

+0

całkowicie mi pomógł, dzięki. –

4

myślę podczas definiowania funkcji z „var foo = function() {...};”, funkcja jest zdefiniowana tylko po tej linii. Innymi słowy, spróbuj tego:

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g; 
    var translate = { 
    "nbsp": " ", 
    "amp" : "&", 
    "quot": "\"", 
    "lt" : "<", 
    "gt" : ">" 
    }; 
    return function(s) { 
    return (s.replace(translate_re, function(match, entity) { 
     return translate[entity]; 
    })); 
    } 
})(); 

var cleanText = text.replace(/^\xa0*([^\xa0]*)\xa0*$/g,""); 
cleanText = replaceHtmlEntities(text); 

Edit: Również „var” po raz pierwszy zadeklarować zmienną (używasz go dwukrotnie na zmiennej cleanText) używać tylko.

Edytuj 2: Problem polega na pisowni nazwy funkcji. Masz "var replaceHtml Entites =". Powinno być "var replaceHtml Entit i es ="

+0

Tak, w moim skrypcie mam funkcję przed miejscem, w którym go używam. Po prostu zapomniałem zrobić to w ten sposób, kiedy zamieszczałem tutaj. Ale to nie zadziałało. – user158678

21

Jeśli tylko trzeba wymienić &nbsp; następnie można użyć znacznie prostsze regex:

var textWithNBSpaceReplaced = originalText.replace(/&nbsp;/g, ' ');

Ponadto, jest literówka w przykładzie div podano &nnbsp; zamiast &nbsp;.

+0

Jak to wpływa na ciągi znaków   w blokach CDATA (ponieważ jest to XHTML)? – cletus

+0

To tak naprawdę nie obejmuje tej sprawy. Jeśli istnieje potrzeba pójścia tak daleko, regex jest prawdopodobnie złym rozwiązaniem. – bobbymcr

+0

Umieściłem literówkę w moim poście - Stack Overflow przekształcił encję w rzeczywistą przestrzeń w podglądzie postu, jeśli użyłem   – user158678

2

Że pierwsza linia jest dość pomieszana. Musi to być tylko:

var cleanText = text.replace(/\xA0/g,' '); 

To powinno być wszystko, czego potrzebujesz.

+0

Dzięki - to też zadziałało! – user158678

4

użyłem tego i to działało:

var cleanText = text.replace(/&amp;nbsp;/g,""); 
+1

ten działa dla mnie. : D dzięki –

+0

Dzięki. To jedyny, który pracuje dla mnie. –

4
var text = "&quot;&nbsp;&amp;&lt;&gt;"; 
text = text.replaceHtmlEntites(); 

String.prototype.replaceHtmlEntites = function() { 
var s = this; 
var translate_re = /&(nbsp|amp|quot|lt|gt);/g; 
var translate = {"nbsp": " ","amp" : "&","quot": "\"","lt" : "<","gt" : ">"}; 
return (s.replace(translate_re, function(match, entity) { 
    return translate[entity]; 
})); 
}; 

spróbować .....to zadziałało dla mnie

1

Usuwa wszystko, co między wszystkimi takimi symbolami: & i ;. jeśli juts chce się ich pozbyć.

text.replace(/&.*;/g,''); 
0

dla mnie zastąpić nie działa ... wypróbować ten kod:

str = str.split("&quot;").join('"'); 
Powiązane problemy