2009-09-30 11 views
39

Je suis en train de traiter xhtml en utilisant javascript. J'obtiens le contenu textuel d'un noeud div en concaténant la valeur nodeValue de tous les noeuds enfants où nodeType == Node.TEXT_NODE.Remplacement   de javascript dom texte noeud

La chaîne résultante contient parfois une entité spatiale insécable. Comment est-ce que je remplace ceci avec un caractère d'espace régulier?

Mon div ressemble à ...

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

Les suggestions suivantes sur le web ne fonctionne pas:

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

suggestions?

+1

"' '&nnbsp;" Vos données ne sont pas le problème ... est-ce? – brianreavis

+0

J'ai mis la faute de frappe dans mon post - Stack Overflow était la conversion de l'entité dans un espace réel dans l'aperçu de la publication si j'ai utilisé   – user158678

+0

Hey, cela ressemble à une faute de frappe dans le nom de la fonction. Voir le modifier à ma question. – Kip

Répondre

90

Ceci est beaucoup plus facile que vous le faites. Le nœud de texte ne sera pas avoir la chaîne littérale "&nbsp;" en elle, cela aura le caractère correspondant ont avec le code 160.

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

textNode.nodeValue = replaceNbsps(textNode.nodeValue); 

MISE À JOUR

Encore plus facile:

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

merci tim. Cela a fonctionné et s'est avéré être plus facile que je le faisais :) – user158678

+0

Superbe - bravo pour le pourboire. –

+0

m'a totalement aidé avec quelque chose, merci. –

4

Je pense que lorsque vous définissez une fonction avec « var foo = function() {...}; », la fonction n'est définie après cette ligne. En d'autres termes, essayez ceci:

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

Modifier: Aussi, utilisez uniquement « var » la première fois que vous déclarez une variable (vous utilisez deux fois sur la variable cleanText).

Édition 2: Le problème est l'orthographe du nom de la fonction. Vous avez "var replaceHtml Entities =". Il devrait être "var replaceHtml Entit i es ="

+0

Oui, dans mon script j'ai la fonction avant l'endroit où je l'utilise. J'ai juste oublié de faire comme ça quand j'ai posté ici. Mais cela n'a pas fonctionné. – user158678

21

Si vous ne devez remplacer &nbsp; vous pouvez utiliser une beaucoup plus simple expression rationnelle:

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

En outre, il y a une faute de frappe dans votre exemple div, il est dit &nnbsp; au lieu de &nbsp;.

+0

Comment cela interagit-il avec les chaînes de caractères   dans les blocs CDATA (puisqu'il s'agit de XHTML)? – cletus

+0

Il ne couvre pas vraiment ce cas. S'il y a un besoin d'aller aussi loin, une regex est probablement la mauvaise solution. – bobbymcr

+0

J'ai mis la faute de frappe dans mon post - Stack Overflow convertissait l'entité en un espace réel dans l'aperçu de la publication si j'utilisais   – user158678

2

Ce première ligne est assez foiré. Il doit seulement être:

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

Cela devrait être tout ce dont vous avez besoin.

+0

Merci - cela a fonctionné aussi bien! – user158678

4

i utilisé cela, et cela a fonctionné:

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

celui-ci fonctionne pour moi. : D merci –

+0

Merci. C'est le seul qui travaille pour moi. –

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

essayer ce .....cela a fonctionné pour moi

1

Supprime tout ce qui entre tous ces symboles entre & et ;. Si vous voulez vous en débarrasser.

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

pour me remplacer ne fonctionne pas ... essayez ce code:

str = str.split("&quot;").join('"'); 
Questions connexes