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?


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


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

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();

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)



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   "));

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

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

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?");

:)


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

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).


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.