Recortar cadena en JavaScript?

1304

¿Cómo recorto una cadena en JavaScript?

Vinod
fuente
290
Vale la pena mencionar dos años después de que se le preguntara a esta pregunta que String.trim () se agregó de forma nativa en JavaScript 1.8.1 / ECMAScript 5, compatible con: Firefox 3.5+, Chrome / Safari 5+, IE9 + (¡solo en modo estándar!) Vea Respuesta de scunliffe: stackoverflow.com/a/8522376/8432
wweicker
46
String.trim()También funciona bien fuera de la caja en Node.js.
Brad
47
Para nitpick: String.trim()el método de clase no existe en ES5 / Node.js; en cambio String.prototype.trim(), existe el método de instancia. Uso: ' foo '.trim()no String.trim(' foo ').
frontendbeauty
39
Dios mío, es 2013 y IE9 en modo compat no tiene método trim () en String.
dbrin
80
Vale la pena señalar que en jQuery, $.trim(str)siempre está disponible.
Sygmoral

Respuestas:

893

Todos los navegadores desde IE9 + tienen un trim()método para cadenas.

Para aquellos navegadores que no son compatibles trim(), puede usar este polyfill de MDN :

if (!String.prototype.trim) {
    (function() {
        // Make sure we trim BOM and NBSP
        var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
        String.prototype.trim = function() {
            return this.replace(rtrim, '');
        };
    })();
}

Dicho esto, si se usa jQuery, $.trim(str)también está disponible y maneja indefinido / nulo.


Mira esto:

String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g, '');};

String.prototype.ltrim=function(){return this.replace(/^\s+/,'');};

String.prototype.rtrim=function(){return this.replace(/\s+$/,'');};

String.prototype.fulltrim=function(){return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ');};
Pradeep Kumar Mishra
fuente
87
Vale la pena señalar que en jQuery, $.trim(str)siempre está disponible.
Sygmoral
481

El recorte de jQuery es conveniente si ya está utilizando ese marco.

$.trim('  your string   ');

Tiendo a usar jQuery a menudo, por lo que recortar cadenas con él es natural para mí. ¿Pero es posible que haya una reacción violenta contra jQuery? :)

barneytron
fuente
1
esto solo recorta espacios en blanco (nueva línea) ... no funciona como php trim, donde también puedes recortar caracteres
Jeffz
jQuery 3.5.0 depreció su método de recorte.
Herbert Peters
165

Aunque hay un montón de respuestas correctas arriba, debe tenerse en cuenta que el Stringobjeto en JavaScript tiene un .trim()método nativo a partir de ECMAScript 5 . Por lo tanto, idealmente, cualquier intento de crear un prototipo del método de recorte realmente debería comprobar si ya existe primero.

if(!String.prototype.trim){  
  String.prototype.trim = function(){  
    return this.replace(/^\s+|\s+$/g,'');  
  };  
}

Agregado de forma nativa en: JavaScript 1.8.1 / ECMAScript 5

Así apoyado en:

Firefox: 3.5+

Safari: 5+

Internet Explorer: IE9 + (¡solo en modo estándar!) Http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more .aspx

Chrome: 5+

Opera: 10.5+

Tabla de soporte de ECMAScript 5: http://kangax.github.com/es5-compat-table/

scunliffe
fuente
128

Hay muchas implementaciones que se pueden usar. Lo más obvio parece ser algo como esto:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "");
};

" foo bar ".trim();  // "foo bar"
Gumbo
fuente
29

Sé que esta pregunta se hizo hace tres años. Ahora, String.trim()se agregó de forma nativa en JavaScript. Por ejemplo, puede recortar directamente de la siguiente manera,

document.getElementById("id").value.trim();
Vijin Paulraj
fuente
3
Esto no funcionará en versiones es decir, use jQuery methd $ .trim (str) si puede
Ben Taliadoros
22

Si está utilizando jQuery, use la jQuery.trim()función Por ejemplo:

if( jQuery.trim(StringVariable) == '')
Alias ​​capaz
fuente
20

Flagrant Badassery tiene 11 versiones diferentes con información de referencia:

http://blog.stevenlevithan.com/archives/faster-trim-javascript

No sorprendentemente, las expresiones basadas en expresiones regulares son más lentas que el bucle tradicional.


Aquí está mi personal. Este código es viejo! Lo escribí para JavaScript1.1 y Netscape 3 y desde entonces solo se ha actualizado ligeramente. (Original usado String.charAt)

/**
 *  Trim string. Actually trims all control characters.
 *  Ignores fancy Unicode spaces. Forces to string.
 */
function trim(str) {
    str = str.toString();
    var begin = 0;
    var end = str.length - 1;
    while (begin <= end && str.charCodeAt(begin) < 33) { ++begin; }
    while (end > begin && str.charCodeAt(end) < 33) { --end; }
    return str.substr(begin, end - begin + 1);
}
Tero
fuente
14

Utilizar los métodos nativos de JavaScript: String.trimLeft(), String.trimRight(), y String.trim().


String.trim()es compatible con IE9 + y todos los demás navegadores principales :

'  Hello  '.trim()  //-> 'Hello'


String.trimLeft()y String.trimRight()no son estándar, pero son compatibles con todos los principales navegadores, excepto IE

'  Hello  '.trimLeft()   //-> 'Hello  '
'  Hello  '.trimRight()  //-> '  Hello'


Sin embargo, el soporte de IE es fácil con un polyfill:

if (!''.trimLeft) {
    String.prototype.trimLeft = function() {
        return this.replace(/^\s+/,'');
    };
    String.prototype.trimRight = function() {
        return this.replace(/\s+$/,'');
    };
    if (!''.trim) {
        String.prototype.trim = function() {
            return this.replace(/^\s+|\s+$/g, '');
        };
    }
}
Diseñador web
fuente
1
@Brad True, pero todavía tienen un amplio soporte de navegador. Y el polyfill se encarga de cualquier inconsistencia.
Web_Designer
1
Debería considerar eliminar su respuesta. No agrega nada que no haya sido cubierto 5 veces por otras respuestas que ya están aquí.
Brad
44
@Brad No he visto a nadie mencionar trimLefto trimRight.
Web_Designer
1
@Brad Prefiero la implementación nativa de JavaScript cuando esté disponible. Esa respuesta tiene sus propios métodos lTrim()y rTrim()métodos.
Web_Designer
1
@Brad No son estándar, pero algunos navegadores todavía los admiten, por lo que en esos navegadores no es necesario crear un polyfill.
Web_Designer
11
String.prototype.trim = String.prototype.trim || function () {
    return this.replace(/^\s+|\s+$/g, "");
};

String.prototype.trimLeft = String.prototype.trimLeft || function () {
    return this.replace(/^\s+/, "");
};

String.prototype.trimRight = String.prototype.trimRight || function () {
    return this.replace(/\s+$/, "");
};

String.prototype.trimFull = String.prototype.trimFull || function () {
    return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, "").replace(/\s+/g, " ");
};

Desvergonzadamente robado de Matt Duereg .

yckart
fuente
7

Recortar código del proyecto angular js

var trim = (function() {

  // if a reference is a `String`.
  function isString(value){
       return typeof value == 'string';
  } 

  // native trim is way faster: http://jsperf.com/angular-trim-test
  // but IE doesn't have it... :-(
  // TODO: we should move this into IE/ES5 polyfill

  if (!String.prototype.trim) {
    return function(value) {
      return isString(value) ? 
         value.replace(/^\s*/, '').replace(/\s*$/, '') : value;
    };
  }

  return function(value) {
    return isString(value) ? value.trim() : value;
  };

})();

y llámalo como trim(" hello ")

rab
fuente
5

usa simplemente código

var str = "       Hello World!        ";
alert(str.trim());

Soporte del navegador

Feature         Chrome  Firefox Internet Explorer   Opera   Safari  Edge
Basic support   (Yes)   3.5     9                   10.5    5       ?

Para el navegador antiguo, agregue el prototipo

if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  };
}
Behnam Mohammadi
fuente
mejor manera de explicar en comparación con otros. pero modificarlo un poco más me refiero a la replacefunción regexp. No lo entendí completamente. ¿Te gustaría explicar un poco más la parte de expresiones regulares?
muneeb_ahmed
4

Aquí hay una manera muy simple:

function removeSpaces(string){
return string.split(' ').join('');
}
HenryDev
fuente
1
te das cuenta de que esta pregunta se hizo en 2009, ¿verdad? : D
GrafiCode
55
Sí lo sé. Pero decidí compartir lo que sé en caso de que alguien lo necesite :)
HenryDev
3
¡lo tienes! ¡El espíritu de aprender y compartir cosas siempre es bueno!
HenryDev
3
"hola mundo" -> "holamundo"
Charlie Burns
2
Esta respuesta es incorrecta. trimsolo debe eliminar los espacios en blanco iniciales y finales (que incluyen pestañas y otros caracteres). Esto, en cambio, elimina todos los espacios, incluidos los del medio.
mbomb007
4

Usar trim()en String, que es nativo, podría ser la forma más fácil:

const fullName = "       Alireza Dezfoolian     ";
const trimmedFullName = fullName.trim();

console.log(trimmedFullName);

Alireza
fuente
3

Puede declarar su variable como cadena y usar su función de recorte:

var str = new String('my string'); 
str= str.trim();
Anahit Serobyan
fuente
2

Hoy, casi todos los navegadores son compatibles String.prototype.trim().

Lo usas así:

var origStr = '   foo  ';
var newStr = origStr.trim(); // Value of newStr becomes 'foo'

En caso de que aún necesite admitir un navegador antiguo que no admite esta función, este es un polyfill sugerido por el MDN:

if (!String.prototype.trim) {
    String.prototype.trim = function () {
       return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
    };
}
John Slegers
fuente
1

Tengo una lib que usa trim. así que lo resolvió usando el siguiente código.

String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };
Zesar
fuente
1
Esta no es una buena solución. Considere el caso donde se cargan dos instancias de jQuery (un escenario común con etiquetas). Cuando se carga la segunda instancia de jQuery, establecerá su .trim()método igual al nativo String.prototype.trimque ya se ha configurado return jQuery.trim(this), creando así un desbordamiento de pila.
Brad M
1
if(!String.prototype.trim){  
  String.prototype.trim = function(){  
    return this.replace(/^\s+|\s+$/gm,'');  
  };  
}

De las respuestas anteriores, difiere agregar bandera m.

Flag mbuscará el texto de varios lineales. En este modo, la marca al comienzo y al final del patrón ( ^ $) se inserta antes y después del carácter de nueva línea ( \n).

simhumileco
fuente
1

Puedes hacerlo usando el JavaScript simple:

function trimString(str, maxLen) {
if (str.length <= maxLen) {
return str;
}
var trimmed = str.substr(0, maxLen);
return trimmed.substr(0, trimmed.lastIndexOf(' ')) + '…';
}

// Let's test it

sentenceOne = "too short";
sentencetwo = "more than the max length";

console.log(trimString(sentenceOne, 15));
console.log(trimString(sentencetwo, 15));
Makyen
fuente
1

Ahora recorte () construir en javascript.

let yourName = ' something   ';
let actualTrimmedName = yourName.trim();

solo consola o imprima el código, su nombre también se recortará.

Sakil Mahmud
fuente
Asegúrese de leer los comentarios sobre la pregunta antes de publicar una respuesta que no agregue ninguna información nueva. Los primeros comentarios principales describen y discuten esto y tienen una gran cantidad de votos positivos. Estos comentarios son de hace casi 8 años y la pregunta en sí tiene casi 11 años.
Ross Gurbutt el
0

No sé qué errores pueden esconderse aquí, pero uso esto:

var some_string_with_extra_spaces="   goes here    "
console.log(some_string_with_extra_spaces.match(/\S.*\S|\S/)[0])

O esto, si el texto contiene ingresa:

console.log(some_string_with_extra_spaces.match(/\S[\s\S]*\S|\S/)[0])

Otro intento:

console.log(some_string_with_extra_spaces.match(/^\s*(.*?)\s*$/)[1])
plavozont
fuente
0

Aquí está en TypeScript:

var trim: (input: string) => string = String.prototype.trim
    ? ((input: string) : string => {
        return (input || "").trim();
    })
    : ((input: string) : string => {
        return (input || "").replace(/^\s+|\s+$/g,"");
    })

Volverá a la expresión regular si el prototipo nativo no está disponible.

Joseph Lennox
fuente
0

Había escrito esta función para trim, cuando la función .trim () no estaba disponible en JS en 2008. Algunos de los navegadores más antiguos todavía no admiten la función .trim () y espero que esta función pueda ayudar a alguien.

FUNCION TRIM

function trim(str)
{
    var startpatt = /^\s/;
    var endpatt = /\s$/;

    while(str.search(startpatt) == 0)
        str = str.substring(1, str.length);

    while(str.search(endpatt) == str.length-1)
        str = str.substring(0, str.length-1);   

    return str;
}

Explicación : La función trim () acepta un objeto de cadena y elimina los espacios en blanco iniciales y finales (espacios, tabulaciones y líneas nuevas) y devuelve la cadena recortada. Puede usar esta función para recortar entradas de formulario para garantizar que se envíen datos válidos.

La función se puede llamar de la siguiente manera como ejemplo.

form.elements[i].value = trim(form.elements[i].value);
AnaMaria
fuente
-4

el mío usa una expresión regular única para buscar casos en los que es necesario recortar, y usa los resultados de la expresión regular para determinar los límites de subcadena deseados:

var illmatch= /^(\s*)(?:.*?)(\s*)$/
function strip(me){
    var match= illmatch.exec(me)
    if(match && (match[1].length || match[2].length)){
        me= me.substring(match[1].length, p.length-match[2].length)
    }
    return me
}

La única decisión de diseño que se tomó fue utilizar una subcadena para realizar la captura final. s / \?: // (hacer la captura del término medio) yy el fragmento de reemplazo se convierte en:

    if(match && (match[1].length || match[3].length)){
        me= match[2]
    }

Hay dos apuestas de rendimiento que hice en estas implicaciones:

  1. ¿La implementación de la subcadena copia los datos de la cadena original? si es así, en el primero, cuando se necesita recortar una cadena, hay un doble recorrido, primero en la expresión regular (que, con suerte, puede ser parcial), y segundo en la extracción de la subcadena. es de esperar que una implementación de subcadena solo haga referencia a la cadena original, por lo que operaciones como la subcadena pueden ser casi gratuitas. cruza los dedos

  2. ¿Qué tan buena es la captura en el regex impl? El término medio, el valor de salida, podría ser potencialmente muy largo. no estaba listo para admitir que todas las capturas de expresiones regulares de expresión no se resistirían a una captura de entrada de un par de cientos de KB, pero tampoco probé (¡demasiados tiempos de ejecución, lo siento!). el segundo SIEMPRE ejecuta una captura; si su motor puede hacer esto sin recibir un golpe, tal vez usando algunas de las técnicas de cuerda de cuerda anteriores, ¡seguro que LO USE!

rektide
fuente
-7

Para IE9 + y otros navegadores

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}
Codler
fuente