Potong spasi dari awal dan akhir string

152

Saya mencoba menemukan cara untuk memangkas spasi dari awal dan akhir string judul. Saya menggunakan ini, tetapi sepertinya tidak berfungsi:

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

Ada ide?

James Jeffery
sumber
1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); lansiran ('-' + s + '-'); // itu bekerja seperti ini, kamu tidak perlu paren atau kurung kurawal.
ekerner
2
Javascript telah .trimdibangun sekarang, jadi ini adalah jawaban untuk peramban modern: stackoverflow.com/a/3000900/29182
Ziggy
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

Jawaban:

216

Catatan: Pada 2015, semua browser utama (termasuk IE> = 9) mendukung String.prototype.trim () . Ini berarti bahwa untuk sebagian besar kasus penggunaan, hanya melakukan str.trim()adalah cara terbaik untuk mencapai apa yang ditanyakan.


Steven Levithan menganalisis berbagai implementasi trimdalam Javascript dalam hal kinerja.

Rekomendasinya adalah:

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

untuk "implementasi tujuan umum yang merupakan browser lintas cepat", dan

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

+ msgstr "jika Anda ingin menangani string panjang dengan sangat cepat di semua browser".

Referensi

polygenelubricants
sumber
21
Safari baru (5), Chrome (5), Firefox (3.6) dan Opera (10.5) semuanya mendukung metode trim String asli. Karena itu, saya akan menetapkan metode ke String.prototype, jika tidak ada, daripada fungsi global baru.
kennebec
14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
kojiro
3
Saya ragu bahwa setelah peningkatan terbaru pada kinerja javascript tes ini masih relevan atau dapat diandalkan seperti pada saat jawaban ini.
Eduardo
2
mengapa Anda menggunakan karakter putih ganda? alias mengapa regex ini /^\s\s*/dan bukan yang satu ini/^\s*/
aemonge
Mengapa trim1dan trim11?
Marty Cortez
68

Jika menggunakan jQuery adalah opsi:

/**
 * 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()));
});

atau hanya:

$.trim(string);
Batu
sumber
48

Seperti yang disebutkan @ChaosPandion , String.prototype.trimmetode ini telah dimasukkan ke dalam Spesifikasi ECMAScript Edisi 5 , beberapa implementasi sudah menyertakan metode ini, jadi cara terbaik adalah mendeteksi implementasi asli dan mendeklarasikannya hanya jika itu tidak tersedia:

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

Maka Anda cukup:

title = title.trim();
CMS
sumber
1
Saya selalu sedikit bingung dengan meme ini untuk memeriksa apakah properti itu sebuah fungsi. Jika bukan suatu fungsi, apakah perilaku yang benar benar-benar menimpanya? Mungkin Anda harus membuat kesalahan dalam kasus itu.
kojiro
1
@kojiro, well, mungkin melemparkan kesalahan akan baik, tapi aku melihatnya seperti ini: Saya mencoba untuk membuat shim spek-compliant , dan jika String.prototype.trimtidak fungsi, itu tidak dengan String.prototype.trimmetode yang dijelaskan pada ECMAScript 5th Edition Spesifikasi, jaminan spesifik yang trimmerupakan objek fungsi pada lingkungan 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

Saya tahu ini adalah pos lama, tetapi saya pikir saya akan membagikan solusi kami. Dalam pencarian kode terpendek (tidak semua orang suka rege terse), orang dapat menggunakan:

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

BTW: Saya menjalankan tes yang sama melalui tautan yang dibagikan di atas blog.stevenlevithan.com - Trim JavaScript Lebih Cepat dan pola ini mengalahkan semua TANGAN lainnya!

Menggunakan IE8, tes ditambahkan sebagai test13. Hasilnya adalah:

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

pengguna590028
sumber
11

ECMAScript 5 mendukung trimdan ini telah diterapkan di Firefox.

trim - MDC

Kekacauan Kekacauan
sumber
11

Di sini, ini harus melakukan semua yang Anda butuhkan

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   "));
CaffGeek
sumber
\ s * tampaknya berlebihan, karena ada + s, tapi ini sedikit lebih cepat
CaffGeek
4

Berikut adalah beberapa metode yang telah saya gunakan di masa lalu untuk memangkas string dalam 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);
}
azatoth
sumber
The regexp ^[\s*]+cocok *di awal string, sehingga trims fungsi Anda "*** Foo"untuk "Foo".
Ferdinand Beyer
mungkin :) bertanya-tanya mengapa tidak ada yang mengeluh ... Sudah lama saya menulis kode itu, dan itu digunakan di en.wikipedia.org/wiki/Wikipedia:Twinkle . off source sekarang setelah Anda menunjukkannya sudah jelas.
azatoth
4

Ini kode saya saat ini, baris ke-2 berfungsi jika saya berkomentar pada baris ke-3, tetapi tidak berfungsi jika saya membiarkannya seperti itu.

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, '-');
James Jeffery
sumber
hapus baris 2 & ketiga, dan gunakan kode dari polygenelubricants, page_title = trim1 (page_title);
semut
jadi pada akhirnya Anda mencoba membersihkan string ini untuk dipangkas, alfa-numerik, dan garis putus-putus bukannya spasi sebagai pemisah?
CaffGeek
@ ya, ya. Untuk membuat URL siput dengan cepat sehingga pengguna dapat melihat seperti apa tampilan URL mereka. Mirip dengan bagaimana wordpress melakukannya ketika membuat posting blog baru.
James Jeffery
2

jQuery.trim ("halo, apa kabar?");

:)

Hantu
sumber
2
Sepertinya Anda mungkin membuat lucu, tetapi perlu diingat bahwa orang yang membaca komentar ini mungkin tergoda untuk menggunakan solusi Anda dan terus maju.
diperingati
$ .trim ("blabh blah bla"); mengembalikan "blabh blah blah" dengan benar
RAY
2

Ketika DOM dimuat penuh, Anda dapat menambahkan ini ke semua bidang teks. Saya tidak pernah memiliki situasi di mana saya perlu menyerahkan ruang terdepan atau tertinggal, jadi melakukannya sepanjang waktu secara global telah bekerja untuk saya ...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});
Tandai Swardstrom
sumber
membutuhkan jQuery. Pertanyaan lain (saya tidak mengujinya): apakah blurbenar - benar terjadi sebelum pengiriman ketika saya berada di bidang dan tekan <kbd> masukkan </kbd> untuk mengirim formulir?
amenthes
2

Inilah yang disarankan oleh Arsitek JavaScript / Guru Douglas Crockford.

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

Catatan: Anda harus mendefinisikan "metode" untuk Function.prototype.

kalau tidak

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

title.trim();    // returns trimmed title

Pengamatan

Di browser terbaru, trim metode disertakan secara default. Jadi, Anda tidak perlu menambahkannya secara eksplisit.

Browser utama Chrome, Firefox, Safari dll mendukung metode trim . Diperiksa di Chrome 55.0.2883.95 (64-bit), Firefox 51.0.1 (64-bit), Safari 10.0 (12602.1.50.0.10).

pembuat kode mitos
sumber
1
var word = " testWord ";   //add here word or space and test

var x = $.trim(word);

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

percobaan rekursif untuk ini

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

sebut seperti ini:

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

jika Anda ingin memfilter karakter khusus, Anda dapat mendefinisikan string daftar pada dasarnya:

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;
    }
}
mguven Guven
sumber
Ada perbedaan halus dari apa yang diminta! Anda memeriksa spasi ' ', tetapi pertanyaannya adalah tentang ruang putih secara umum, termasuk "\n", "\t"dan karakter tidak dapat dicetak lainnya yang cocok dengan regex oleh /\s/.
amenthes
maka Anda dapat mengedit jika kondisi sebagai "jika (" \ t \ r \ n ".indexOf (k [0])> - 1)" masih berfungsi, itu sudah tipe tertentu.
mguven Guven