Il trim è quell'operazione che si effettua sulle stringhe per eliminare gli spazi iniziali e gli spazi finali.
La classe String possiede in quasi tutti i linguaggi questo metodo, ma non in javascript, così ce lo dobbiamo creare.

Eccolo qui:


function trim(str) {
return str.replace(/^\s*([\s\S]*?)\s*$/,"$1");
}


Il metodo è sviluppato usando una regular expression (RegExp) e un replace.



Saltate la parte tra le righe se non sapete cos'è una Regular Expression
Vediamo la regular expression in dettaglio.

Attenzione, il verbo matchare non è che esista in italiano, ma sinceramente non saprei che altro verbo usare. Comunque se dico che una cosa matcha le A, in una stringa "CASO" quella cosa matcherà la A...chiaro no?

^\s*([\s\S]*?)\s*$

^ questo carattere indica l'inizio della stringa.
\s questa parte indica uno spazio.
\s* con l'asterisco davanti indica 0 o più spazi.
^\s* matcha quindi tutti gli spazi a inizio stringa.

() mettere un pezzo di una regexp fra parentesi fa si che il motore si ricordi e renda accessibile successivamente cos'è stato matchato dall'espressione fra parentesi.
[] le parentesi quadre indicano una serie di caratteri.
\S indica qualsiasi carattere a parte lo spazio.
[\s\S] indica quindi qualsiasi carattere.
[\s\S]* indica quindi qualsiasi carattere 0 o più volte.
[\s\S]*? indica infine qualsiasi carattere 0 o più volte ma limitando il match il più possibile. Questa è probabilmente la cosa più complicata da capire. Il motore farà si che appena c'è qualcosa che può essere matchato da un pezzo successivo della regexp questo non sia matchato da questo pezzo. Chiaro no? ...
([\s\S]*?) dunque ciò che è matchato da questo pezzo di regexp sarà accessibile poi.

$ è la fine della stringa
\s*$ è quindi 0 o più volte spazi prima della fine. Il ? di prima serve appunto per far si che ogni spazio finale sia matchato da questo pezzo di regexp e non dal precedente.

^\s*([\s\S]*?)\s*$ la nostra regular expression è pronta.

Attenzione, non sono un maestro jedi con le RegExp, non le ho usate molto nella mia breve vita, se trovate che ce ne sia una migliore fate un fischio.

Ora basta usarla. Per farlo useremo una chiamata a replace. Il primo parametro di replace è la stringa da trovare e sostituire il secondo è invece il sostituto. La nostra regexp, matcha interamente tutte le stringhe quindi sostituiremo completamente la stringa originale con il secondo parametro. Il secondo parametro sembrerebbe un $1 ma è in realtà una magia :D javascript riconosce $1 e lo sostituisce con il primo match che si ricorda, ovvero ciò che ha matchato con ([\s\S]*?). Se nella regexp ci fossero state più () sarebbero state accessibili con $1 $2 $3...

Dunque il metodo trim è pronto.



Spesso si usa attaccare metodi ai prototype delle classi basi:

String.prototype.trim = function() {
return this.replace(/^\s*([\s\S]*?)\s*$/,"$1");
};

in modo da poter comodamente chiamare

var myStr = " questa è la mia stringa da trimmare ";
myStr = myStr.trim();

ma io consiglio di lasciar in pace i prototype delle classi base per evitare potenziali collisioni e usare il metodo dopo averlo messo sotto un "namespace":

if (!window.tpatpc) {
window.tpatpc = {};
}

tpatpc.trim = function(str) {
return str.replace(/^\s*([\s\S]*?)\s*$/,"$1");
}

var myStr = " questa è la mia stringa da trimmare ";
myStr = tpatpc.trim(myStr);