¿Eliminar un guión largo de una cadena en JavaScript?

He encontrado un error en mi aplicación web que no estoy seguro de cómo solucionarlo.

Los cuadros de texto me envían el guión largo como parte de su contenido (ya sabes, el guión largo especial que MS Word inserta automáticamente a veces). Sin embargo, no puedo encontrar una manera de reemplazarlo; ya que si trato de copiar ese carácter y lo pongo en una declaración str.replace de JavaScript, no se procesa correctamente y rompe el script.

¿Cómo puedo arreglar esto?

El personaje específico que lo está matando es —.

Además, si ayuda, paso el valor como un parámetro GET y luego lo codifico en XML y lo envío a un servidor.

preguntado el 03 de mayo de 12 a las 18:05

Eso es muy extraño. ¿Puedes publicar algún código para que podamos ver cómo pueden aparecer los personajes en primer lugar? -

Algo como str = str.replace('&ldash;', '')? -

5 Respuestas

Este código puede ayudar:

text = text.replace(/\u2013|\u2014/g, "-");

Reemplaza todos los – (-) y — (—) símbolos con guiones simples (-).

DEMO: http://jsfiddle.net/F953H/

contestado el 03 de mayo de 12 a las 18:05

más simple: /\u2013|\u2014/g ;-)- Gras doble

Ese personaje es llamado un Guión largo. Puedes reemplazarlo así:

str.replace('\u2014', '');​​​​​​​​​​

Aquí hay un violín de ejemplo: http://jsfiddle.net/x67Ph/

La \u2014 se llama un secuencia de escape unicode. Estos permiten especificar un carácter Unicode por su código. 2014 pasa a ser el Em Dash.

contestado el 03 de mayo de 12 a las 18:05

Hay tres guiones largos Unicode de los que debe preocuparse: http://en.wikipedia.org/wiki/Dash

Puede reemplazar los caracteres Unicode directamente usando el escape Unicode:

'—my string'.replace( /[\u2012\u2013\u2014\u2015]/g, '' )

contestado el 03 de mayo de 12 a las 18:05

Este código reemplazaría solo la primera aparición. Para reemplazar todas las ocurrencias, necesita una expresión regular con la bandera global: /regex/g - Gras doble

Le di una oportunidad, pero no tuvo ningún efecto: el — todavía apareció, y el javascript no lo atrapó. - cd6

Cualquier razón particular por la que no estaba usando rangos, es decir /[\u2012-\u2015]/g? ¿Hay algún problema de compatibilidad con algunos navegadores? - phk

Es posible que haya más caracteres que se comporten de esta manera y es posible que desee reutilizarlos en html más adelante. Una forma más genérica de lidiar con esto podría ser reemplazar todos los 'caracteres extendidos' con su equivalente codificado en html. Podrías hacer eso así:

[yourstring].replace(/[\u0080-\uC350]/g, 
                      function(a) {
                        return '&#'+a.charCodeAt(0)+';';
                      }
);

contestado el 03 de mayo de 12 a las 18:05

Con el estándar ECMAScript 2018, JavaScript RegExp ahora es compatible con las clases de propiedad (o categoría) Unicode. Uno de ellos, \p{Dash}, coincide con cualquier punto de carácter Unicode que sea guiones:

/\p{Dash}/gu

En ES5, la expresión equivalente es:

/[-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]|\uD803\uDEAD/g

Consulte las Referencia de utilidades Unicode.

Aquí hay algunos ejemplos de JavaScript:

const text = "Dashes: \uFF0D\uFE63\u058A\u1400\u1806\u2010-\u2013\uFE32\u2014\uFE58\uFE31\u2015\u2E3A\u2E3B\u2053\u2E17\u2E40\u2E5D\u301C\u30A0\u2E1A\u05BE\u2212\u207B\u208B\u3030𐺭";
const es5_dash_regex = /[-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]|\uD803\uDEAD/g;
console.log(text.replace(es5_dash_regex, '-')); // Normalize each dash to ASCII hyphen
// => Dashes: ----------------------------

Para hacer coincidir uno o más guiones y reemplazarlos con un solo carácter (o eliminarlos de una sola vez):

/\p{Dash}+/gu
/(?:[-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2053\u207B\u208B\u2212\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D]|\uD803\uDEAD)+/g

Respondido el 15 de diciembre de 21 a las 10:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.