Dizenin başından ve sonundan boşlukları kırp


152

Başlık dizesinin başından ve sonundan boşluk kırpmak için bir yol bulmaya çalışıyorum. Bunu kullanıyordum, ama işe yaramıyor gibi görünüyor:

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

Herhangi bir fikir?


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); uyarı ('-' + s + '-'); // böyle çalışıyor, parenslere veya kare parantezlere ihtiyacınız yok.
ekerner

2
Javascript şu .trimanda yerleşik, bu yüzden bu modern tarayıcılar için cevap: 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

Yanıtlar:


216

Not: 2015 itibarıyla tüm ana tarayıcılar (IE> = 9 dahil) String.prototype.trim () 'i desteklemektedir . Bu, çoğu kullanım durumunda str.trim(), sorunun basitçe sorulması, sorunun sorduğunu başarmanın en iyi yolu olduğu anlamına gelir .


Steven Levithan trim, Javascript'teki birçok farklı uygulamayı performans açısından analiz etti .

Onun tavsiyesi:

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

"hızlı çapraz tarayıcı olan genel amaçlı uygulama" ve

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

"uzun dizeleri tüm tarayıcılarda son derece hızlı işlemek istiyorsanız".

Referanslar


21
Yeni Safari (5), Chrome (5), Firefox (3.6) ve Opera (10.5), yerel bir String kırpma yöntemini desteklemektedir. Bu durumda, yeni bir global işlev yerine, String.prototype için bir yöntem atarım.
kennebec

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

3
Javascript performansındaki son iyileştirmelerden sonra, bu testin bu cevap sırasında olduğu gibi hala ilgili veya güvenilir olduğundan şüpheliyim.
Eduardo

2
neden çift beyaz karakterler kullanıyorsun? aka neden bu /^\s\s*/değil bu regex/^\s*/
aemonge

Neden trim1ve trim11?
Marty Cortez

68

JQuery kullanmak bir seçenektir:

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

ya da sadece:

$.trim(string);

48

As @ChaosPandion bahsedildiği, String.prototype.trimyöntem sokulmuş olan ECMAScript 5th Edition , şartnamenin bazı uygulamalar iyi yolu yerli uygulanmasını algılayıp ilan etmektir yüzden zaten bu yöntemi dahil sadece mevcut değilse:

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

Ardından şunları yapabilirsiniz:

title = title.trim();

1
Ben her zaman özelliği bir işlevi olup olmadığını kontrol bu meme tarafından şaşkın. Bu bir işlev değilse, üzerine yazmak için doğru davranış mı? Belki de bu durumda bir hata atmalısınız.
kojiro

1
@kojiro, belki, bir hata atmak iyi olurdu, ama böyle görüyorum: Spesifikasyona uygun bir şim yapmaya çalışıyorum ve eğerString.prototype.trim bir işlev değil, bu değilString.prototype.trim ECMAScript 5 Edition açıklanan yöntem Özellikler, spec trim, ES5 ortamlarında bir fonksiyon nesnesi olduğunu garanti eder .
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

Bunun eski bir gönderi olduğunu biliyorum, ama çözümümüzü paylaşacağımı düşündüm. (Değil herkes sadece gelmez en kısa kodu için arayışı içinde aşk veciz regex), bir yerine kullanabilirsiniz:

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

BTW: Aynı testi yukarıda paylaşılan bağlantı üzerinden yaptım blog.stevenlevithan.com - Daha hızlı JavaScript Trim ve bu model diğer tüm ELleri yen !

IE8 kullanarak, test13 olarak test eklendi. Sonuçlar:

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



11

Burada, ihtiyacınız olan her şey bu olmalı

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 \ s * gereksiz, çünkü \ s +, ama biraz daha hızlı
CaffGeek

4

İşte geçmişte js dizeleri kırpmak için kullanılan bazı yöntemler:

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

RegExp ^[\s*]+maçları *böylece fonksiyon düzeltir o dizenin başında "*** Foo"üzere "Foo".
Ferdinand Beyer

muhtemelen :) merak kimse neden şikayet etmedi ... Uzun zaman önce bu kodu yazdım ve en.wikipedia.org/wiki/Wikipedia:Twinkle kullanılır . kaynak belirttiğinize göre artık açıktır.
azatoth

4

İşte benim mevcut kod, 2. satır 3. satır yorum yaparsanız çalışır, ama nasıl olduğunu bırakırsanız çalışmaz.

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

2. ve üçüncü satırları kaldırın ve kodu poligen yağlayıcılardan kullanın, page_title = trim1 (page_title);
karınca

sonuçta ayırıcı olarak boşluklar yerine kesilmiş, alfa-sayısal ve tire için bu dizeyi temizlemeye mi çalışıyorsunuz?
CaffGeek

@ chad evet. Kullanıcıların URL'lerinin nasıl görüneceğini görebilmeleri için anında bilgi URL'leri oluşturmak. Yeni blog yayınları oluştururken wordpress'in yaptığı gibi.
James Jeffery


2

jQuery.trim ("merhaba, nasılsınız?");

:)


2
Görünüşe göre komik bir şeyler yapıyor olabilirsiniz, ancak bu yorumu okuyan kişilerin çözümünüzü kullanmaya ve ilerlemeye cazip gelebileceğini unutmayın.
commadelimed

$ .trim ("blabh blah blah"); doğru bir şekilde "blah blah blah" döndürür
RAY

2

DOM tamamen yüklendiğinde, bunu tüm metin alanlarına ekleyebilirsiniz. Hiçbir zaman liderlik veya takip alanı sunmam gereken bir durumum olmadı, bu yüzden küresel olarak her zaman yapmak benim için çalıştı ...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

jQuery gerektirir. Başka bir soru (ben test etmedi): bluraslında ben bir alanda olduğum ve bir form göndermek için <kbd> enter </kbd> vurmak zaman gönderme önce gerçekleşir?
amenthes

2

JavaScript Architect / Guru Douglas Crockford tarafından önerilen budur.

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

Not: Function.prototype için "yöntem" tanımlamanız gerekir.

alternatif olarak

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

title.trim();    // returns trimmed title

Gözlem

Son tarayıcılarda, kırpma yöntemi varsayılan olarak dahil edilir. Yani açıkça eklemenize gerek yok.

Başlıca tarayıcılar Chrome, Firefox, Safari vb . Kırpma yöntemini destekler . Chrome 55.0.2883.95 (64 bit), Firefox 51.0.1 (64 bit), Safari 10.0 (12602.1.50.0.10) içinde kontrol edildi.


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

bunun için tekrarlı bir deneme

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

şöyle çağır:

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

spesifik karakterleri filtrelemek istiyorsanız, temel olarak bir liste dizesi tanımlayabilirsiniz:

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

Sorulanlardan ince bir fark var! Bir alan için kontrol ediyoruz ' ', ama soru olmak üzere genel olarak beyaz boşluk, ilgili "\n", "\t"ve tarafından regex eşleştirilir olmayan diğer yazdırılabilir karakterleri /\s/.
amenthes

o zaman koşulu "if (" \ t \ r \ n ".indexOf (k [0])> - 1)" olarak çalışırsa yine de çalışır, bunlar zaten belirli türlerdir.
mguven guven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.