Zeichenfolge in JavaScript schneiden?

1304

Wie schneide ich eine Zeichenfolge in JavaScript?

Vinod
quelle
290
Es ist erwähnenswert, dass String.trim () zwei Jahre nach dieser Frage nativ in JavaScript 1.8.1 / ECMAScript 5 hinzugefügt wurde, unterstützt in: Firefox 3.5+, Chrome / Safari 5+, IE9 + (nur im Standardmodus!) Siehe scunliffes Antwort: stackoverflow.com/a/8522376/8432
wweicker
46
String.trim()funktioniert auch sofort in Node.js.
Brad
47
Zu nitpick:, String.trim()die Klassenmethode, existiert nicht in ES5 / Node.js; Stattdessen existiert String.prototype.trim()die Instanzmethode. Verwendung: ' foo '.trim()nicht String.trim(' foo ').
Frontendbeauty
39
OMG, es ist 2013 und IE9 im kompatiblen Modus hat keine trim () -Methode für String!
Dbrin
80
Erwähnenswert ist, dass in jQuery $.trim(str)immer verfügbar ist.
Sygmoral

Antworten:

893

Alle Browser seit IE9 + haben eine trim()Methode für Zeichenfolgen.

Für diejenigen Browser, die dies nicht unterstützen trim(), können Sie diese Polyfüllung von MDN verwenden :

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, '');
        };
    })();
}

Das heißt, wenn verwendet jQuery, $.trim(str)ist auch verfügbar und behandelt undefiniert / null.


Sieh dir das an:

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
quelle
87
Erwähnenswert ist, dass in jQuery $.trim(str)immer verfügbar ist.
Sygmoral
481

Das Trimmen von jQuery ist praktisch, wenn Sie dieses Framework bereits verwenden.

$.trim('  your string   ');

Ich benutze jQuery oft, daher ist es für mich selbstverständlich, Strings damit zu beschneiden. Aber ist es möglich, dass es da draußen eine Gegenreaktion gegen jQuery gibt? :) :)

Barneytron
quelle
1
Dies schneidet nur Leerzeichen (Newline). Es funktioniert nicht wie PHP-Trimmen, wo Sie auch Zeichen schneiden können
Jeffz
jQuery 3.5.0 hat die Trimmmethode abgeschrieben.
Herbert Peters
165

Obwohl es oben eine Reihe korrekter Antworten gibt, sollte beachtet werden, dass das StringObjekt in JavaScript ab ECMAScript 5 über eine native .trim()Methode verfügt . Daher sollte im Idealfall jeder Versuch, die Trimmmethode zu prototypisieren, wirklich prüfen, ob sie bereits vorhanden ist.

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

Nativ hinzugefügt in: JavaScript 1.8.1 / ECMAScript 5

So unterstützt in:

Firefox: 3.5+

Safari: 5+

Internet Explorer: IE9 + (nur im Standardmodus!) Http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more .aspx

Chrome: 5+

Oper: 10,5+

ECMAScript 5-Supporttabelle: http://kangax.github.com/es5-compat-table/

scunliffe
quelle
128

Es gibt viele Implementierungen , die verwendet werden können. Das offensichtlichste scheint so etwas zu sein:

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

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

Ich weiß, dass diese Frage vor drei Jahren gestellt wurde. Jetzt String.trim()wurde sie nativ in JavaScript hinzugefügt. Für eine Instanz können Sie direkt wie folgt zuschneiden :

document.getElementById("id").value.trim();
Vijin Paulraj
quelle
3
Dies funktioniert nicht in dh Versionen, verwenden Sie die jQuery-Methode $ .trim (str), wenn Sie können
Ben Taliadoros
22

Wenn Sie jQuery verwenden, verwenden Sie die jQuery.trim()Funktion. Zum Beispiel:

if( jQuery.trim(StringVariable) == '')
Fähiger Alias
quelle
20

Flagrant Badassery hat 11 verschiedene Verzierungen mit Benchmark-Informationen:

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

Es ist nicht überraschend, dass Regexp-basierte Schleifen langsamer sind als herkömmliche Schleifen.


Hier ist meine persönliche. Dieser Code ist alt! Ich habe es für JavaScript1.1 und Netscape 3 geschrieben und es wurde seitdem nur geringfügig aktualisiert. (Original verwendet 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
quelle
14

Verwenden Sie die nativen JavaScript - Methoden: String.trimLeft(), String.trimRight(), und String.trim().


String.trim()wird in IE9 + und allen anderen gängigen Browsern unterstützt :

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


String.trimLeft()und String.trimRight()sind nicht Standard, werden jedoch in allen gängigen Browsern außer IE unterstützt

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


Die IE-Unterstützung ist mit einer Polyfüllung jedoch einfach:

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, '');
        };
    }
}
Webdesigner
quelle
1
@Brad True, aber sie haben immer noch breite Browser-Unterstützung. Und die Polyfüllung füllt alle Inkonsistenzen.
Web_Designer
1
Sie sollten erwägen, Ihre Antwort zu löschen. Es wird nichts hinzugefügt, was noch nicht 5x von anderen Antworten hier abgedeckt wurde.
Brad
4
@Brad Ich habe noch niemanden erwähnt trimLeftoder gesehen trimRight.
Web_Designer
1
@Brad Ich bevorzuge die native JavaScript-Implementierung, wenn verfügbar. Diese Antwort macht ihre eigenen lTrim()und rTrim()Methoden.
Web_Designer
1
@Brad Sie sind nicht Standard, werden jedoch von einigen Browsern weiterhin unterstützt, sodass in diesen Browsern keine Polyfüllung erstellt werden muss.
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, " ");
};

Schamlos von Matt Duereg gestohlen .

yckart
quelle
7

Trimmcode aus dem eckigen js- Projekt

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;
  };

})();

und nenne es als trim(" hello ")

rab
quelle
5

benutze einfach Code

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

Browser-Unterstützung

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

Für alten Browser Prototyp hinzufügen

if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  };
}
Behnam Mohammadi
quelle
Der beste Weg, um zu erklären, wie man es mit anderen vergleicht. Aber modifiziere es ein wenig mehr. Ich meine replaceFunktion Regexp. Ich habe es nicht vollständig verstanden. Möchten Sie den Regexp-Teil etwas näher erläutern?
Muneeb_ahmed
4

Hier ist ein sehr einfacher Weg:

function removeSpaces(string){
return string.split(' ').join('');
}
HenryDev
quelle
1
Sie wissen, dass diese Frage im Jahr 2009 gestellt wurde, oder? : D
GrafiCode
5
Ja, ich weiß. Aber ich beschloss zu teilen, was ich weiß, falls jemand es braucht :)
HenryDev
3
du hast es! Der Geist des Lernens und Teilens von Dingen ist immer eine gute Sache!
HenryDev
3
"Hallo Welt" -> "Helloworld"
Charlie Burns
2
Diese Antwort ist falsch. trimsollte nur führende und nachfolgende Leerzeichen entfernen (einschließlich Tabulatoren und anderer Zeichen). Dadurch werden stattdessen alle Leerzeichen entfernt, einschließlich der Leerzeichen in der Mitte.
mbomb007
4

Mit trim()auf String , der eine native könnte der einfachste Weg sein:

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

console.log(trimmedFullName);

Alireza
quelle
3

Sie können Ihre Variable einfach als Zeichenfolge deklarieren und ihre Trimmfunktion verwenden:

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

Heute unterstützt so ziemlich jeder Browser String.prototype.trim().

Sie verwenden es so:

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

Falls Sie möglicherweise noch einen alten Browser unterstützen müssen, der diese Funktion nicht unterstützt, ist dies eine vom MDN vorgeschlagene Polyfüllung:

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

Ich habe eine Bibliothek, die Trim verwendet. so löste es mit dem folgenden Code.

String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };
Zesar
quelle
1
Dies ist keine gute Lösung. Stellen Sie sich den Fall vor, in dem zwei Instanzen von jQuery geladen werden (ein häufiges Szenario mit Tags). Wenn die zweite Instanz von jQuery geladen wird, wird die .trim()Methode gleich der String.prototype.trimbereits festgelegten Methode gesetzt return jQuery.trim(this), wodurch ein Stapelüberlauf entsteht.
Brad M
1
if(!String.prototype.trim){  
  String.prototype.trim = function(){  
    return this.replace(/^\s+|\s+$/gm,'');  
  };  
}

Von den vorherigen Antworten unterscheidet es sich beim Hinzufügen eines Flags m .

Flag mdurchsucht den Text mehrerer linearer. In diesem Modus wird die Markierung für Anfang und Ende des Musters ( ^ $) vor und nach dem Zeilenumbruchzeichen ( \n) eingefügt .

simhumileco
quelle
1

Sie können dies mit dem einfachen JavaScript tun:

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
quelle
1

Jetzt trim () in Javascript bauen.

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

Nur Konsolen- oder Druckcode, dann wird auch Ihr Name gekürzt.

Sakil Mahmud
quelle
Lesen Sie unbedingt die Kommentare zu der Frage, bevor Sie eine Antwort veröffentlichen, die keine neuen Informationen hinzufügt. Die obersten Kommentare beschreiben / diskutieren dies alle und haben eine große Anzahl von Up-Votes. Diese Kommentare stammen von vor fast 8 Jahren und die Frage selbst ist fast 11 Jahre alt.
Ross Gurbutt
0

Ich weiß nicht, welche Fehler sich hier verstecken können, aber ich benutze dies:

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

Oder dies, wenn Text enthält:

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

Noch ein Versuch:

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

Hier ist es in TypeScript:

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

Es wird auf den regulären Ausdruck zurückgegriffen, wenn der native Prototyp nicht verfügbar ist.

Joseph Lennox
quelle
0

Ich hatte diese Funktion für das Trimmen geschrieben, als die .trim () -Funktion 2008 in JS nicht verfügbar war. Einige der älteren Browser unterstützen die .trim () -Funktion immer noch nicht und ich hoffe, dass diese Funktion jemandem helfen kann.

TRIM-FUNKTION

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;
}

Erläuterung : Die Funktion trim () akzeptiert ein Zeichenfolgenobjekt und entfernt alle beginnenden und nachfolgenden Leerzeichen (Leerzeichen, Tabulatoren und Zeilenumbrüche) und gibt die zugeschnittene Zeichenfolge zurück. Mit dieser Funktion können Sie Formulareingaben kürzen, um sicherzustellen, dass gültige Daten gesendet werden.

Die Funktion kann als Beispiel folgendermaßen aufgerufen werden.

form.elements[i].value = trim(form.elements[i].value);
Ana Maria
quelle
-4

Mine verwendet einen einzelnen regulären Ausdruck, um nach Fällen zu suchen, in denen ein Trimmen erforderlich ist, und verwendet die Ergebnisse dieses regulären Ausdrucks, um die gewünschten Teilstring-Grenzen zu bestimmen:

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
}

Die einzige Entwurfsentscheidung, die dazu führte, war die Verwendung eines Teilstrings, um die endgültige Erfassung durchzuführen. s / \ ?: // (machen Sie die mittelfristige Erfassung) und und das Ersatzfragment wird:

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

Es gibt zwei Leistungswetten, die ich in diesen Impls gemacht habe:

  1. Kopiert die Teilstring-Implementierung die Daten der ursprünglichen Zeichenfolge? Wenn dies der Fall ist, gibt es im ersten Fall, wenn ein String gekürzt werden muss, eine doppelte Durchquerung, zuerst im regulären Ausdruck (der hoffentlich teilweise sein kann) und zweitens in der Teilstring-Extraktion. Hoffentlich verweist eine Teilzeichenfolgenimplementierung nur auf die ursprüngliche Zeichenfolge, sodass Operationen wie Teilzeichenfolgen nahezu kostenlos sein können. Finger kreuzen

  2. Wie gut ist die Erfassung im Regex-Gerät? Der mittlere Wert, der Ausgabewert, könnte möglicherweise sehr lang sein. Ich war nicht bereit zu glauben, dass die Erfassung aller Regex-Impls nicht mit ein paar hundert KB Input-Capture einhergehen würde, aber ich habe auch nicht getestet (zu viele Laufzeiten, sorry!). der zweite führt IMMER eine Erfassung durch; Wenn Ihr Motor dies ohne einen Treffer kann, vielleicht mit einigen der oben genannten String-Roping-Techniken, verwenden Sie es auf jeden Fall!

rektide
quelle
-7

Für IE9 + und andere Browser

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