2009-09-30 17 views
39

Estoy procesando xhtml usando javascript. Obtengo el contenido de texto para un nodo div al concatenar el nodeValue de todos los nodos secundarios donde nodeType == Node.TEXT_NODE.Reemplazando   del javascript dom text nodo

La cadena resultante a veces contiene una entidad espacial no disruptiva. ¿Cómo reemplazo esto con un personaje de espacio normal?

Mi div ve así ...

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

Las siguientes sugerencias que se encuentran en la web no funcionó:

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]; 
    })); 
    } 
})(); 

alguna sugerencia?

+1

"' '&nnbsp;" Sus datos no es el problema ... ¿verdad? – brianreavis

+0

puse el error en mi publicación - Stack Overflow estaba convirtiendo la entidad en un espacio real en la vista previa de la publicación si usaba   – user158678

+0

Oye, parece un error ortográfico en el nombre de la función. Ver la edición de mi pregunta. – Kip

Respuesta

90

Esto es mucho más fácil que lo que está haciendo. El nodo de texto no tendrá la cadena literal "&nbsp;" en ella, que va a tener tiene el carácter correspondiente con el código 160.

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

textNode.nodeValue = replaceNbsps(textNode.nodeValue); 

ACTUALIZACIÓN

Aún más fácil:

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

gracias tim. esto funcionó y resultó ser más fácil de lo que lo estaba haciendo :) – user158678

+0

Excelente - aplausos por la propina. –

+0

me ayudó con algo, gracias. –

4

Yo creo cuando se define una función con "var foo = function() {...};", la función sólo está definido después de esa línea. En otras palabras, intente esto:

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); 

Editar: Además, sólo utilice "var" la primera vez que se declara una variable (que se está usando dos veces en la variable cleanText).

Editar 2: El problema es la ortografía del nombre de la función. Tiene "var replaceHtml Entites =". Debe ser "var replaceHtml Entit i es ="

+0

Sí, en mi script tengo la función antes del lugar donde la uso. Me olvidé de hacerlo de esa manera cuando publiqué aquí. Pero no funcionó. – user158678

21

Si sólo necesita reemplazar &nbsp; entonces se puede utilizar una expresión regular mucho más simple:

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

Además, hay un error tipográfico en su ejemplo div, dice &nnbsp; en lugar de &nbsp;.

+0

¿Cómo interactúa eso con las cadenas de caracteres   en bloques CDATA (dado que esto es XHTML)? – cletus

+0

Realmente no cubre ese caso. Si hay una necesidad de llegar tan lejos, una expresión regular es probablemente la solución incorrecta. – bobbymcr

+0

puse el error tipográfico en mi publicación - Stack Overflow estaba convirtiendo la entidad en un espacio real en la vista previa de la publicación si usé   – user158678

2

Eso La primera línea está bastante desordenada. Solo necesita ser:

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

Eso debería ser todo lo que necesita.

+0

Gracias - ¡esto también funcionó! – user158678

4

He utilizado este, y funcionó:

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

este funciona para mí. : D gracias –

+0

Gracias. Este es el único que trabaja para mí. –

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]; 
})); 
}; 

probar esto .....esto funcionó para mí

1

Elimina todo lo que tienen esos símbolos entre & y ;. si quieres quieres deshacerte de ellos.

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

para mí reemplazo no trabaja ... prueba este código:

str = str.split("&quot;").join('"'); 
Cuestiones relacionadas