Taglia gli spazi dall'inizio e dalla fine della stringa


152

Sto cercando di trovare un modo per tagliare gli spazi dall'inizio e dalla fine della stringa del titolo. Lo stavo usando, ma non sembra funzionare:

title = title.replace(/(^[\s]+|[\s]+$)/g, '');

Qualche idea?


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); alert ('-' + s + '-'); // funziona così, non hai bisogno delle parentesi quadre o delle parentesi quadre.
ekerner

2
Javascript è .trimora incorporato, quindi questa è la risposta per i browser moderni: stackoverflow.com/a/3000900/29182
Ziggy

Fare riferimento a questo articolo: javascriptstutorial.com/blog/trim-string

function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; }
Badri Gs

Risposte:


216

Nota: a partire dal 2015, tutti i principali browser (incluso IE> = 9) supportano String.prototype.trim () . Ciò significa che, per la maggior parte dei casi d'uso, fare semplicemente str.trim()è il modo migliore per ottenere ciò che pone la domanda.


Steven Levithan ha analizzato molte diverse implementazioni di trimin Javascript in termini di prestazioni.

La sua raccomandazione è:

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

per "un'implementazione generale che è veloce tra browser" e

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

"se vuoi gestire stringhe lunghe eccezionalmente veloci in tutti i browser".

Riferimenti


21
Il nuovo Safari (5), Chrome (5), Firefox (3.6) e Opera (10.5) supportano tutti un metodo di trim String nativo. Stando così le cose, assegnerei un metodo a String.prototype, se non esiste, piuttosto che una nuova funzione globale.
Kennebec,

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

3
Dubito che dopo i recenti miglioramenti delle prestazioni di JavaScript questo test sia ancora pertinente o affidabile come lo era al momento di questa risposta.
Eduardo,

2
perché stai usando doppi caratteri bianchi? aka perché questo regex /^\s\s*/e non questo/^\s*/
aemonge,

Perché trim1e trim11?
Marty Cortez,

68

Se si utilizza jQuery è un'opzione:

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

o semplicemente:

$.trim(string);

48

Come menzionato @ChaosPandion , il String.prototype.trimmetodo è stato introdotto nelle specifiche ECMAScript 5th Edition , alcune implementazioni includono già questo metodo, quindi il modo migliore è rilevare l'implementazione nativa e dichiararla solo se non è disponibile:

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

Quindi puoi semplicemente:

title = title.trim();

1
Sono sempre un po 'confuso da questo meme di verificare se la proprietà è una funzione. Se non è una funzione, il comportamento giusto è davvero sovrascriverlo? Forse dovresti gettare un errore in quel caso.
Kojiro,

1
@kojiro, beh, forse lanciare un errore sarebbe buono, ma lo vedo così: sto provando a fare uno shim conforme alle specifiche , e se String.prototype.trimnon è una funzione, non è il String.prototype.trimmetodo descritto nell'ECMAScript 5th Edition Specifica, la specifica garantisce che trimè un oggetto funzione su ambienti ES5.
CMS,

7
throw { name: "UnlikelyPolyfillException", message: "Did someone really write a property on the String prototype named 'trim' that isn't a ECMA 5 compatible shim? Come on now, that's crazy." }
Kojiro,

34

So che questo è un vecchio post, ma ho pensato di condividere la nostra soluzione. Nella ricerca del codice più breve (non tutti adorano solo la regex concisa), si potrebbe invece usare:

title = title.replace(/(^\s+|\s+$)/g, '');

A proposito: ho eseguito questo stesso test attraverso il link condiviso sopra blog.stevenlevithan.com - Trim JavaScript più veloce e questo schema ha battuto tutte le altre MANI!

Utilizzando IE8, aggiunto test come test13. I risultati furono:

Lunghezza originale: 226002
trim1: 110ms (lunghezza: 225994)
trim2: 79ms (lunghezza: 225994)
trim3: 172ms (lunghezza: 225994)
trim4: 203ms (lunghezza: 225994)
trim5: 172ms (lunghezza: 225994)
trim6: 312ms (lunghezza: 225994)
trim7: 203ms (lunghezza: 225994)
trim8: 47ms (lunghezza: 225994)
trim9: 453ms (lunghezza: 225994)
trim10: 15ms (lunghezza: 225994)
trim11: 16ms (lunghezza: 225994)
trim12: 31ms (lunghezza: 225994)
trim13: 0ms (lunghezza: 226002)



11

Qui, questo dovrebbe fare tutto ciò di cui hai bisogno

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

\ s \ s * sembra ridondante, dato che c'è \ s +, ma è un po 'più veloce
CaffGeek

4

Ecco alcuni metodi che ho usato in passato per tagliare le stringhe in js:

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

Il RegExp ^[\s*]+corrisponde *all'inizio della stringa, in modo che i trim funzione "*** Foo"a "Foo".
Ferdinand Beyer,

probabilmente :) chiedo perché nessuno si sia lamentato ... È stato tanto tempo fa che ho scritto quel codice, ed è usato in en.wikipedia.org/wiki/Wikipedia:Winkle . off source ora che lo fai notare è ovvio.
Azatoth,

4

Ecco il mio codice attuale, la seconda riga funziona se commento la terza riga, ma non funziona se la lascio così com'è.

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

rimuovere la seconda e la terza riga e utilizzare il codice dai poligenelubrificanti, page_title = trim1 (page_title);
formica

quindi alla fine stai cercando di pulire questa stringa per essere ritagliata, alfanumerica e trattini anziché spazi come separatori?
CaffGeek,

@chad si. Per creare URL di lumache al volo in modo che gli utenti possano vedere come sarà il loro URL. Simile a come funziona Wordpress quando crea nuovi post sul blog.
James Jeffery,


2

jQuery.trim ("ciao, come stai?");

:)


2
Sembra che tu stia facendo qualcosa di divertente, ma tieni presente che le persone che leggono questo commento potrebbero essere tentate di usare la tua soluzione e andare avanti.
commadelimitato

$ .trim ("blabh blah blah"); restituisce correttamente "blabh blah blah"
RAY

2

Quando il DOM è completamente caricato, puoi aggiungerlo a tutti i campi di testo. Non ho mai avuto una situazione in cui avrei dovuto inviare spazio iniziale o finale, quindi farlo tutto il tempo a livello globale ha funzionato per me ...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

richiede jQuery. Un'altra domanda (non l'ho provata): si blurverifica effettivamente prima dell'invio quando sono in un campo e premo <kbd> inserisci </kbd> per inviare un modulo?
amenthes,

2

Questo è ciò che viene suggerito dall'architetto JavaScript / Guru Douglas Crockford.

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

Nota: è necessario definire "metodo" per Function.prototype.

In alternativa

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

title.trim();    // returns trimmed title

Osservazione

Nei browser recenti, il metodo di taglio è incluso per impostazione predefinita. Quindi non è necessario aggiungerlo esplicitamente.

I principali browser Chrome, Firefox, Safari ecc. Supportano il metodo trim . Controllato in Chrome 55.0.2883.95 (64 bit), Firefox 51.0.1 (64 bit), Safari 10.0 (12602.1.50.0.10).


1
var word = " testWord ";   //add here word or space and test

var x = $.trim(word);

if(x.length > 0)
    alert('word');
else
    alert('spaces');

0

un tentativo ricorsivo per questo

function t(k){ 
    if (k[0]==' ') {
        return t(k.substr(1,k.length));
    } else if (k[k.length-1]==' ') {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

chiama così:

t("      mehmet       "); //=>"mehmet"

se vuoi filtrare i caratteri spesific puoi fondamentalmente definire una stringa di lista:

function t(k){
    var l="\r\n\t "; //you can add more chars here.
    if (l.indexOf(k[0])>-1) {
        return t(k.substr(1,k.length));
    } else if (l.indexOf(k[k.length-1])>-1) {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

C'è una sottile differenza da ciò che viene chiesto! Si sta verificando per uno spazio ' ', ma la domanda è sullo spazio bianco in generale, compresa "\n", "\t"e altri personaggi non stampabili che vengono abbinati in regex da /\s/.
amenthes,

quindi puoi modificare if condizione come "if (" \ t \ r \ n ".indexOf (k [0])> - 1)" funziona ancora, questi sono già alcuni tipi.
mguven guven,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.