2009-08-04 11 views
5

Estoy usando javascript para establecer el valor de una entrada con texto que puede contener html caracteres específicos como &  etc. Por lo tanto, estoy tratando de encontrar una expresión regular que coincida con estos valores y reemplácelos con el valor apropiado ("&", " ") respectivamente, solo que no puedo deducir la expresión regular para hacerlo. Esto es lo que estoy tratando de hacer. Crea un objeto contiene las coincidencias y la referencia al valor de reposición:javascript regex reemplazar html chars

 
var specialChars = { 
    " " : " ", 
    "&" : "&", 
    ">" : ">", 
    "&lt;" : "<" 
} 

Entonces, quiero coincidir con mi secuencia

 
var stringToMatch = "This string has special chars &amp; and &nbsp;" 

Probé algo así como

 
stringToMatch.replace(/(&nbsp;|&)/g,specialChars["$1"}); 

pero no funciona. Realmente no entiendo cómo capturar la etiqueta especial y reemplazarla. Cualquier ayuda es muy apreciada.

+0

Tal vez "& nbsp;" mostrará su  ? – lance

+0

¿Por qué no utilizar escapando? http://www.w3schools.com/jsref/jsref_escape.asp – Joel

+0

escape convertiría & en% 26amp% 3B. Definitivamente no es lo que estoy buscando – brad

Respuesta

15

Creo que puede usar las funciones de una pregunta sobre un tema ligeramente diferente (Efficiently replace all accented characters in a string?). respuesta

Jason de Bunting tiene algunas buenas ideas + la explicación necesaria, aquí está su solución con algunas modificaciones para que pueda empezar (si ha resultado útil, Upvote su respuesta original, así, ya que este es su código, esencialmente)

var replaceHtmlEntites = (function() { 
    var translate_re = /&(nbsp|amp|quot|lt|gt);/g, 
     translate = { 
      'nbsp': String.fromCharCode(160), 
      'amp' : '&', 
      'quot': '"', 
      'lt' : '<', 
      'gt' : '>' 
     }, 
     translator = function($0, $1) { 
      return translate[$1]; 
     }; 

    return function(s) { 
     return s.replace(translate_re, translator); 
    }; 
})(); 

exigible como

var stringToMatch = "This string has special chars &amp; and &amp;nbsp;"; 
var stringOutput = replaceHtmlEntites(stringToMatch); 

ENTIDADES numeradas son aún más fácil, puede reemplazarlos mucho más genéricamente el uso de un poco de matemáticas y String.fromCharCode().


Otro, posibilidad mucho más simple sería así (funciona en cualquier navegador)

function replaceHtmlEntites(string) { 
    var div = document.createElement("div"); 
    div.innerHTML = string; 
    return div.textContent || div.innerText; 
} 

replaceHtmlEntites("This string has special chars &lt; &amp; &gt;"); 
// -> "This string has special chars < & >" 
+0

Así que aparentemente no entiendo el de Regex. Su código me pareció bastante bueno, pero los valores que se pasan a la función en realidad contienen el total   No solo el nbsp. Pensé que se suponía que los corchetes coincidían solo el interior de los caracteres? De todos modos, modding que traducen el objeto para contener el conjunto " ", "&" etc. funcionó, de lo contrario, acaba de regresar indefinido. Gracias – brad

+0

La respuesta se ha modificado un poco para acomodarse a esto. Supongo que lo has intentado con el código original. Lo anterior funciona para mí, lo probé (nuevamente). – Tomalak

+0

¿De verdad? No, copié tu código y lo ejecuté a través del depurador, el valor para mí que se aprobó fue el total de  . Muy raro. Estoy usando safari y probé en Firefox. Voy a probar algunos otros navegadores también. De todos modos, gracias de nuevo – brad

1

Puede utilizar un reemplazo basado en la función de hacer lo que quiere hacer:

var myString = '&'+'nbsp;&'+'nbsp;&tab;&copy;'; 
myString.replace(/&\w+?;/g, function(e) { 
    switch(e) { 
     case '&nbsp;': 
      return ' '; 
     case '&tab;': 
      return '\t'; 
     case '&copy;': 
      return String.fromCharCode(169); 
     default: 
      return e; 
    } 
}); 

Sin embargo, yo te pido que tenga en cuenta su situación. Si está recibiendo & nbsp; y & copia; y otras entidades HTML en sus valores de texto, ¿realmente desea reemplazarlos? ¿Deberías convertirlos luego?

Solo algo para tener en cuenta.

¡Salud!

+1

Esto es mucho más sencillo que la respuesta aceptada anteriormente. Además, creo que se escalará mejor a medida que se agreguen más entidades a la lista, lo cual es importante ya que la lista de entidades nombradas es SUPER larga. ¡Le robaron el hijo! – Toby

+1

No estoy para los puntos. Estoy interesado en las preguntas. Pero gracias por el sentimiento. :) También está el hecho de que el caso predeterminado debe ser devuelto, no ajustado. arriba. – coderjoe

2

Otra forma sería la creación de un objeto div

var tmp = document.createElement("div"); 

A continuación, asignar el texto a su innerHTML

tmp.innerHTML = mySpecialString; 

Y finalmente leer el contenido de texto del elemento

var output = tmp.textContent || tmp.innerText //for IE compatibility 

Y hay que ir ...

+0

Estoy usando el texto para establecer el valor de una entrada (w/jquery) así que $ (entrada) .val (someText) es el texto que necesita el reemplazo – brad

+0

Bien, entendí el punto. Cuando haces lo que he sugerido, todos los valores son convertidos por el motor HTML del navegador ya que la propiedad "textContent" o "innerText" contiene el "texto resultante". – BYK

Cuestiones relacionadas