JavaScript scheint nicht über eine eigene trim()
Methode. Wie kann ich mit JavaScript Leerzeichen am Anfang und Ende einer Zeichenkette abschneiden?
Antworten
Zu viele Anzeigen?Bei ltrim werden Leerzeichen, die am Anfang der Zeichenkette verankert sind, durch nichts ersetzt:
str2 = str.replace(/^\s+/,'');
Bei rtrim werden am Ende der Zeichenkette verankerte Leerzeichen durch nichts ersetzt:
str2 = str.replace(/\s+$/,'');
Für Trimmung:
str2 = str.replace(/^\s+|\s+$/g,'');
Diese verwenden alle Regex'es, um die eigentliche Arbeit zu erledigen.
Utilisez Ariel Fleslers Schnellschneidefunktion :
// Licensed under BSD
function myBestTrim( str ){
var start = -1,
end = str.length;
while( str.charCodeAt(--end) < 33 );
while( str.charCodeAt(++start) < 33 );
return str.slice( start, end + 1 );
};
Meine Lösung, obwohl, wäre dies (weil das String-Objekt in Firefox 3.5 und höher bereits eine trim
Methode ):
String.prototype.trim = String.prototype.trim || function () {
var start = -1,
end = this.length;
while( this.charCodeAt(--end) < 33 );
while( this.charCodeAt(++start) < 33 );
return this.slice( start, end + 1 );
};
Warum nicht einfach den String-Prototyp ändern? Warum nicht die Trim-Funktion aus einer Open-Source-Bibliothek klauen, wie ich es hier mit YUI getan habe? (Müssen Sie wirklich zu laden und ein ganzes Framework für diese einfache Taks?) Setzen Sie sie zusammen und Sie erhalten diese:
String.prototype.trim = function() {
try {
return this.replace(/^\s+|\s+$/g, "");
} catch(e) {
return this;
}
}
var s = " hello ";
alert(s.trim() == "hello"); // displays true
Ich habe eine Trimm-Funktion Geschwindigkeit im Auge. Diese Funktion schlägt mit deutlichem Abstand alle 24 Konkurrenten (von denen viele reguläre Ausdrücke verwenden) und auch die native string.trim() von Chrome und Chromium(!) und ist genauso schnell wie die trim() von Safari. Die Testergebnisse sind hier: http://jsperf.com/mega-trim-test/7
function trim27(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
return str.substring(i, j + 1);
}
Die Funktion schneidet die Zeichen " \n\r\t\f ", aber es ist einfach, weitere Whitespace-Zeichen hinzuzufügen, z.B. solche, die regexp als Whitespaces verwendet ( \s ) mit nur geringen Leistungseinbußen (siehe http://jsperf.com/mega-trim-test/8 ).
Bearbeiten: Das bisherige trim27() schneidet nur die häufigsten Zeichen ab (" \n\r\t\f "), aber um alle möglichen Leerzeichen abzuschneiden, habe ich unten eine neue Funktion mytrim() eingefügt:
if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
var mytrim = function(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
return str.substring(i, j + 1);
};
else var mytrim = function(str) {
return str.trim();
}
Verwenden Sie es so:
var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"
Die obige Funktion mytrim() bewirkt Folgendes:
- Schneidet 26 verschiedene Whitespaces (alle 25 Whitespaces, die in http://perfectionkills.com/whitespace-deviations/ und zusätzlich uFEFF, was NULL BREITE NO-BREAK SPACE ist.
- Macht die Beschneidungsergebnisse in allen Browsern konsistent.
- Verwendet natives trim(), wenn es verfügbar ist UND hat die Fähigkeit, alle 27 verschiedenen Whitespaces zu trimmen. Die Ausnahme sind Chrome und Chromium, die beide über ein so langsames natives trim() verfügen, dass wir anstelle des nativen unser benutzerdefiniertes trim verwenden.
- UND DAS WICHTIGSTE: Es ist nicht schön und nicht kurz, aber es ist eindeutig schneller als jede der 24 konkurrierenden Alternativen in http://jsperf.com/mega-trim-test/12 (Ausnahme: der ziemlich alte Firefox 3.6.25 unter Windows 7 führt mytrim() aus unbekanntem Grund ziemlich langsam aus).
Ich verwende dies mit nativem JavaScript
// Adding trim function to String object if its not there
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
}
So verwenden
var myString = " some text ";
alert(myString.trim());
例
// Adding trim function to String object if its not there
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
}
var str = " some text ";
console.log(str.trim());