Potong string dalam JavaScript?

1304

Bagaimana cara memotong string dalam JavaScript?

Vinod
sumber
290
Layak disebutkan dua tahun setelah pertanyaan ini diajukan bahwa String.trim () ditambahkan secara native di JavaScript 1.8.1 / ECMAScript 5, didukung di: Firefox 3.5+, Chrome / Safari 5+, IE9 + (hanya dalam mode Standar!) Lihat jawaban scunliffe: stackoverflow.com/a/8522376/8432
wweicker
46
String.trim()juga berfungsi dengan baik di luar kotak di Node.js.
Brad
47
Untuk nitpick:, String.trim()metode kelas, tidak ada di ES5 / Node.js; sebaliknya, String.prototype.trim()metode instance, ada. Penggunaan:, ' foo '.trim()tidak String.trim(' foo ').
frontendbeauty
39
OMG, ini 2013 dan IE9 dalam mode compat tidak memiliki metode trim () pada String!
dbrin
80
Perlu dicatat bahwa di jQuery, $.trim(str)selalu tersedia.
Sygmoral

Jawaban:

893

Semua browser sejak IE9 + miliki trim() metode untuk string.

Untuk browser yang tidak mendukung trim(), Anda dapat menggunakan polyfill ini dari 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, '');
        };
    })();
}

Yang mengatakan, jika menggunakan jQuery, $.trim(str)juga tersedia dan menangani undefined / null.


Lihat ini:

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
sumber
87
Perlu dicatat bahwa di jQuery, $.trim(str)selalu tersedia.
Sygmoral
481

Trim dari jQuery nyaman jika Anda sudah menggunakan kerangka kerja itu.

$.trim('  your string   ');

Saya cenderung sering menggunakan jQuery, jadi memangkas string dengan itu wajar bagi saya. Tapi mungkin saja ada reaksi balik terhadap jQuery di luar sana? :)

barneytron
sumber
1
ini hanya memangkas spasi (baris baru) .. itu tidak bekerja seperti trim php, di mana Anda dapat memangkas karakter juga
Jeffz
jQuery 3.5.0 mendepresiasi metode trim mereka.
Herbert Peters
165

Meskipun ada banyak jawaban yang benar di atas, perlu dicatat bahwa Stringobjek dalam JavaScript memiliki .trim()metode asli pada ECMAScript 5 . Jadi idealnya setiap upaya untuk prototipe metode trim harus benar-benar memeriksa untuk melihat apakah sudah ada terlebih dahulu.

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

Ditambahkan secara native di: JavaScript 1.8.1 / ECMAScript 5

Dengan demikian didukung dalam:

Firefox: 3.5+

Safari: 5+

Internet Explorer: IE9 + (hanya dalam mode Standar!) 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+

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

scunliffe
sumber
128

Ada banyak implementasi yang bisa digunakan. Tampaknya yang paling jelas adalah sesuatu seperti ini:

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

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

Saya tahu pertanyaan ini telah ditanyakan tiga tahun lalu. Sekarang, String.trim()ditambahkan secara native di JavaScript. Sebagai contoh, Anda dapat memotong langsung sebagai berikut,

document.getElementById("id").value.trim();
Vijin Paulraj
sumber
3
Ini tidak akan berfungsi dalam versi yaitu, gunakan jQuery methd $ .trim (str) jika Anda bisa
Ben Taliadoros
22

Jika Anda menggunakan jQuery, gunakan jQuery.trim()fungsinya. Sebagai contoh:

if( jQuery.trim(StringVariable) == '')
Mampu Alias
sumber
20

Flagrant Badassery memiliki 11 trim yang berbeda dengan informasi benchmark:

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

Yang tidak mengejutkan berbasis regexp lebih lambat daripada loop tradisional.


Ini salah satu pribadi saya. Kode ini sudah tua! Saya menulisnya untuk JavaScript1.1 dan Netscape 3 dan sejak itu baru sedikit diperbarui. (Asli menggunakan 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
sumber
14

Gunakan Metode asli JavaScript: String.trimLeft(), String.trimRight(), dan String.trim().


String.trim()didukung di IE9 + dan semua browser utama lainnya :

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


String.trimLeft()dan String.trimRight()tidak standar, tetapi didukung di semua browser utama kecuali IE

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


Dukungan IE mudah dilakukan dengan 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, '');
        };
    }
}
Desainer web
sumber
1
@Brad Benar, tetapi mereka masih memiliki dukungan browser yang luas. Dan polyfill menangani segala ketidakkonsistenan.
Web_Designer
1
Anda harus mempertimbangkan untuk menghapus jawaban Anda. Itu tidak menambahkan apa pun yang belum dibahas 5x oleh jawaban lain yang sudah ada di sini.
Brad
4
@Brad saya belum melihat ada yang menyebutkan trimLeftatau trimRight.
Web_Designer
1
@Brad Saya lebih suka implementasi JavaScript asli saat tersedia. Jawaban itu membentuk sendiri lTrim()dan rTrim()metode.
Web_Designer
1
@Brad Mereka non-standar namun beberapa browser masih mendukungnya, jadi di browser itu tidak perlu membuat 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, " ");
};

Tanpa malu-malu dicuri dari Matt duereg .

yaart
sumber
7

Potong kode dari proyek js sudut

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

})();

dan menyebutnya sebagai trim(" hello ")

rab
sumber
5

cukup gunakan kode

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

Dukungan browser

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

Untuk browser lama, tambahkan prototipe

if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  };
}
Behnam Mohammadi
sumber
cara terbaik untuk menjelaskan dibandingkan dengan yang lain. tetapi memodifikasinya sedikit lebih saya maksud replacefungsi regexp. saya tidak mengerti sepenuhnya. Anda ingin menjelaskannya lebih banyak tentang bagian regexp?
muneeb_ahmed
4

Inilah cara yang sangat sederhana:

function removeSpaces(string){
return string.split(' ').join('');
}
HenryDev
sumber
1
Anda menyadari pertanyaan ini ditanyakan pada tahun 2009, bukan? : D
GrafiCode
5
Ya saya tahu. Tetapi saya memutuskan untuk membagikan apa yang saya tahu seandainya seseorang membutuhkannya :)
HenryDev
3
kamu mengerti! semangat belajar dan berbagi hal selalu merupakan hal yang baik!
HenryDev
3
"hello world" -> "helloworld"
Charlie Burns
2
Jawaban ini salah. trimseharusnya hanya menghapus spasi spasi awal dan akhir (yang mencakup tab dan karakter lainnya). Ini malah menghapus semua ruang, termasuk yang ada di tengah.
mbomb007
4

Menggunakan trim()pada String yang merupakan asli bisa menjadi cara termudah:

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

console.log(trimmedFullName);

Alireza
sumber
3

Anda bisa mendeklarasikan variabel Anda sebagai string dan menggunakan fungsi trimnya:

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

Hari ini, hampir semua browser mendukung String.prototype.trim() .

Anda menggunakannya seperti ini:

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

Jika Anda mungkin masih perlu mendukung browser lama yang tidak mendukung fitur ini, ini adalah polyfill yang disarankan oleh MDN:

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

Saya memiliki lib yang menggunakan trim. jadi selesaikan dengan menggunakan kode berikut.

String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };
Zesar
sumber
1
Ini bukan solusi yang baik. Pertimbangkan kasus di mana dua instance jQuery dimuat (skenario umum dengan tag). Ketika instance ke-2 dari jQuery dimuat, itu akan mengatur .trim()metode itu sama dengan asli String.prototype.trimyang telah ditetapkan return jQuery.trim(this), sehingga menciptakan stack overflow.
Brad M
1
if(!String.prototype.trim){  
  String.prototype.trim = function(){  
    return this.replace(/^\s+|\s+$/gm,'');  
  };  
}

Dari jawaban sebelumnya, ini berbeda dengan menambahkan flag m.

Bendera makan mencari teks beberapa linier. Dalam mode ini, tanda awal dan akhir pola ( ^ $) dimasukkan sebelum dan sesudah karakter baris baru ( \n).

simhumileco
sumber
1

Anda dapat melakukannya menggunakan JavaScript biasa:

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

Sekarang trim () build dalam javascript.

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

cukup konsol atau cetak kode maka nama Anda akan dipangkas juga.

Sakil Mahmud
sumber
Pastikan untuk membaca komentar pada pertanyaan sebelum mengirim jawaban yang tidak menambahkan informasi baru. Beberapa komentar teratas semuanya menggambarkan / mendiskusikan ini dan memiliki banyak suara. Komentar-komentar ini berasal dari hampir 8 tahun yang lalu dan pertanyaannya sendiri sudah hampir 11 tahun.
Ross Gurbutt
0

Tidak tahu bug apa yang bisa disembunyikan di sini, tapi saya menggunakan ini:

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

Atau ini, jika teks berisi masuk:

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

Usaha lain:

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

Ini dia di TypeScript:

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

Ini akan jatuh kembali ke regex jika prototipe asli tidak tersedia.

Joseph Lennox
sumber
0

Saya telah menulis fungsi ini untuk trim, ketika fungsi .trim () tidak tersedia di JS pada tahun 2008 lalu. Beberapa browser lama masih tidak mendukung fungsi .trim () dan saya berharap fungsi ini dapat membantu seseorang.

FUNGSI POTONG

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

Penjelasan : Trim fungsi () menerima objek string dan menghapus spasi spasi awal dan akhir (spasi, tab, dan baris baru) dan mengembalikan string yang dipangkas. Anda dapat menggunakan fungsi ini untuk memotong input formulir untuk memastikan data yang valid akan dikirim.

Fungsi ini dapat dipanggil dengan cara berikut sebagai contoh.

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

tambang menggunakan regex tunggal untuk mencari kasus di mana pemangkasan diperlukan, dan menggunakan hasil regex itu untuk menentukan batas substring yang diinginkan:

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
}

satu keputusan desain yang digunakan adalah menggunakan substring untuk melakukan tangkapan akhir. s / \?: // (membuat penangkapan jangka menengah) dan dan fragmen pengganti menjadi:

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

ada dua taruhan kinerja yang saya buat di impl ini:

  1. apakah implementasi substring menyalin data string asli? jika demikian, di pertama, ketika string harus dipangkas ada dua traversal, pertama di regex (yang mungkin, semoga sebagian), dan kedua dalam ekstraksi substring. semoga implementasi substring hanya mereferensikan string asli, sehingga operasi seperti substring bisa hampir gratis. menyilangkan jari

  2. seberapa bagus tangkapan di regex impl? jangka menengah, nilai output, bisa berpotensi sangat lama. saya tidak siap untuk bank bahwa menangkap semua regex impls 'tidak akan menolak pada beberapa ratus KB masukan input, tetapi saya juga tidak menguji (terlalu banyak runtimes, maaf!). SELALU kedua menjalankan penangkapan; jika mesin Anda dapat melakukan ini tanpa membentur, mungkin menggunakan beberapa teknik pengikatan tali di atas, pasti MENGGUNAKANNYA!

rektide
sumber
-7

Untuk IE9 + dan browser lainnya

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