ตัดช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง


152

ฉันพยายามหาวิธีตัดช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดของสตริงชื่อ ฉันใช้สิ่งนี้ แต่ดูเหมือนจะไม่ทำงาน:

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

ความคิดใด ๆ


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); การแจ้งเตือน ('-' + s + '-'); // มันใช้งานได้เช่นนี้คุณไม่จำเป็นต้องมีวงเล็บหรือวงเล็บเหลี่ยม
ekerner

2
Javascript ได้.trimสร้างขึ้นแล้วดังนั้นนี่คือคำตอบสำหรับเบราว์เซอร์สมัยใหม่: stackoverflow.com/a/3000900/29182
Ziggy

อ้างถึงบทความนี้: javascriptstutorial.com/blog/trim-string

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

คำตอบ:


216

หมายเหตุ: ในฐานะของปี 2015 เบราว์เซอร์ที่สำคัญทั้งหมด (รวมทั้ง IE> = 9) สนับสนุน String.prototype.trim () ซึ่งหมายความว่าสำหรับกรณีการใช้งานส่วนใหญ่เพียงทำเป็นstr.trim()วิธีที่ดีที่สุดในการบรรลุคำถามที่ถาม


Steven Levithan วิเคราะห์การใช้งานที่แตกต่างกันจำนวนมากtrimใน Javascript ในแง่ของประสิทธิภาพ

คำแนะนำของเขาคือ:

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

สำหรับ "การใช้งานทั่วไปที่รวดเร็วข้ามเบราว์เซอร์" และ

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

"ถ้าคุณต้องการจัดการสตริงที่ยาวเป็นพิเศษในเบราว์เซอร์ทั้งหมด".

อ้างอิง


21
Safari ใหม่ (5), Chrome (5), Firefox (3.6) และ Opera (10.5) สนับสนุนวิธีการตัดขอบแบบดั้งเดิม ในกรณีนี้ฉันจะกำหนดวิธีการให้กับ String.prototype หากไม่มีอยู่แทนที่จะเป็นฟังก์ชั่นใหม่ระดับโลก
kennebec

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

3
ฉันสงสัยว่าหลังจากการปรับปรุงประสิทธิภาพจาวาสคริปต์เมื่อเร็ว ๆ นี้การทดสอบนี้ยังคงเกี่ยวข้องหรือเชื่อถือได้เหมือนเดิมในเวลาที่คำตอบนี้
Eduardo

2
ทำไมคุณใช้อักขระสีขาวคู่ อาคาว่าทำไม regex นี้/^\s\s*/และไม่ใช่อันนี้/^\s*/
aemonge

ทำไมtrim1และtrim11?
Marty Cortez

68

หากใช้ jQuery เป็นตัวเลือก:

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

หรือเพียงแค่:

$.trim(string);

48

ตามที่@ChaosPandion ได้กล่าวถึงString.prototype.trimวิธีการดังกล่าวได้ถูกนำมาใช้ในข้อกำหนดรุ่น ECMAScript 5th Edition การใช้งานบางอย่างได้รวมวิธีการนี้ไว้แล้วดังนั้นวิธีที่ดีที่สุดคือการตรวจจับการใช้งานดั้งเดิมและประกาศเฉพาะในกรณีที่ไม่มี:

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

จากนั้นคุณสามารถ:

title = title.trim();

1
ฉันรู้สึกสับสนเล็กน้อยจากการตรวจสอบคุณสมบัตินี้ว่าเป็นฟังก์ชั่นหรือไม่ หากไม่ใช่ฟังก์ชั่นที่เป็นพฤติกรรมที่ถูกต้องจริงๆที่จะเขียนทับมัน? บางทีคุณควรโยนข้อผิดพลาดในกรณีนั้น
kojiro

1
@kojiro ดีอาจจะขว้างปาข้อผิดพลาดจะดี แต่ฉันเห็นมันเช่นนี้ฉันพยายามที่จะทำให้การชิมสเป็คที่สอดคล้องและถ้าString.prototype.trimไม่ได้เป็นฟังก์ชั่นมันไม่ได้เป็นString.prototype.trimวิธีการอธิบายไว้ใน ECMAScript 5th Edition ข้อมูลจำเพาะข้อมูลจำเพาะรับประกันได้ว่าtrimเป็นวัตถุฟังก์ชั่นในสภาพแวดล้อม 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

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่แค่คิดว่าฉันจะแบ่งปันวิธีแก้ปัญหาของเรา ในการค้นหารหัสที่สั้นที่สุด (ไม่ใช่ทุกคนที่ชื่นชอบ terse regex) คุณสามารถใช้:

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

BTW: ฉันทำการทดสอบเดียวกันนี้ผ่านลิงก์ที่แชร์ไว้ด้านบนblog.stevenlevithan.com - Trim JavaScript ที่เร็วขึ้นและรูปแบบนี้เอาชนะมืออื่น ๆ ทั้งหมดลง!

ใช้ IE8 เพิ่มการทดสอบเป็น test13 ผลการวิจัยพบว่า:

ความยาวเดิม: 226002
trim1: 110ms (ความยาว: 225994)
trim2: 79ms (ความยาว: 225994)
trim3: 172ms (ความยาว: 225994)
trim4: 203ms (ความยาว: 225994)
trim5: 172ms (ความยาว: 225994)
trim6: 312ms 225994)
trim7: 203ms (ความยาว: 225994)
trim8: 47ms (ความยาว: 225994)
trim9: 453ms (ความยาว: 225994)
trim10: 15ms (ความ
ยาว: 225994)
trim11: 16ms (ความยาว: 225994)
trim13: 0ms (ความยาว: 226002)



11

ที่นี่สิ่งนี้ควรทำทุกสิ่งที่คุณต้องการ

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 * ดูเหมือนซ้ำซ้อนเนื่องจากมี \ s + แต่มันเร็วขึ้นเล็กน้อย
CaffGeek

4

นี่คือวิธีการที่ฉันเคยใช้ในอดีตเพื่อตัดแต่งสตริงใน 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);
}

นิพจน์ทั่วไป^[\s*]+ตรง*ที่จุดเริ่มต้นของสตริงเพื่อให้จดจ้องการทำงานของคุณจะ"*** Foo" "Foo"
เฟอร์ดินานด์เบเยอร์

อาจ :) น่าแปลกใจว่าทำไมไม่มีใครบ่น ... มันเป็นช่วงเวลาที่นานมาแล้วที่ผมเขียนโค้ดที่และก็ใช้ในen.wikipedia.org/wiki/Wikipedia:Twinkle ปิดแหล่งที่มาตอนนี้คุณชี้ให้เห็นว่ามันชัดเจน
azatoth

4

นี่คือรหัสปัจจุบันของฉันบรรทัดที่ 2 ใช้งานได้หากฉันแสดงความคิดเห็นในบรรทัดที่ 3 แต่จะไม่ทำงานหากฉันปล่อยให้เป็นแบบนี้

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

ลบบรรทัดที่สองและสามและใช้รหัสจาก polygenelubricants, page_title = trim1 (page_title);
มด

ดังนั้นในที่สุดคุณกำลังพยายามทำความสะอาดสายนี้เพื่อตัดแต่ง, ตัวอักษรและตัวเลขและขีดกลางแทนการเว้นวรรคเป็นตัวคั่น?
CaffGeek

@ ชาดใช่ ในการสร้าง URL กระสุนในทันทีเพื่อให้ผู้ใช้สามารถดูว่า URL ของพวกเขาจะมีลักษณะอย่างไร คล้ายกับที่ wordpress ทำเมื่อสร้างโพสต์บล็อกใหม่
James Jeffery


2

jQuery.trim ("สวัสดีคุณเป็นอย่างไรบ้าง");

:)


2
ดูเหมือนว่าคุณกำลังทำตัวตลก แต่โปรดจำไว้ว่าคนที่อ่านความคิดเห็นนี้อาจถูกล่อลวงให้ใช้วิธีการแก้ปัญหาของคุณและเดินหน้าต่อไป
กำหนดเวลา

$ .trim ("blabh blah blah"); ส่งคืนค่าอย่างถูกต้อง "blabh blah blah"
RAY

2

เมื่อ DOM โหลดเต็มคุณสามารถเพิ่มสิ่งนี้ลงในฟิลด์ข้อความทั้งหมด ฉันไม่เคยมีสถานการณ์ที่ฉันจำเป็นต้องส่งผู้นำหรือพื้นที่ต่อท้ายดังนั้นการทำมันตลอดเวลาทั่วโลกได้ทำงานให้ฉัน ...

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

ต้องใช้ jQuery คำถามอื่น (ฉันไม่ได้ทดสอบ): blurเกิดขึ้นจริงก่อนที่จะส่งเมื่อฉันอยู่ในฟิลด์และกด <kbd> ป้อน </kbd> เพื่อส่งแบบฟอร์มหรือไม่
amenthes

2

นี่คือสิ่งที่แนะนำโดย JavaScript Architect / Guru Douglas Crockford

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

หมายเหตุ: คุณต้องกำหนด "method" สำหรับ Function.prototype

อีกทางเลือกหนึ่ง

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

title.trim();    // returns trimmed title

การสังเกต

ในเบราว์เซอร์ที่ผ่านมาวิธีการตัดแต่งจะรวมอยู่โดยค่าเริ่มต้น ดังนั้นคุณไม่จำเป็นต้องเพิ่มมันอย่างชัดเจน

เบราว์เซอร์หลัก ๆ เช่น Chrome, Firefox, Safari ฯลฯ รองรับวิธีการตัด ตรวจสอบใน Chrome 55.0.2883.95 (64 บิต), Firefox 51.0.1 (64 บิต), Safari 10.0 (12602.1.50.0.10)



0

ลองทำซ้ำสำหรับสิ่งนี้

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

โทรแบบนี้:

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

หากคุณต้องการกรองตัวสะกดคุณสามารถกำหนดสตริงรายการโดยทั่วไป:

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

มีความแตกต่างเล็กน้อยจากสิ่งที่ถูกถาม! คุณกำลังตรวจสอบพื้นที่' 'แต่คำถามเป็นเรื่องเกี่ยวกับพื้นที่สีขาวโดยทั่วไปรวมทั้ง"\n", "\t"และตัวละครอื่น ๆ ที่ไม่ใช่พิมพ์ที่มีการจับคู่ใน regex /\s/โดย
amenthes

จากนั้นคุณสามารถแก้ไขหากเงื่อนไขเป็น "if (" \ t \ r \ n ".indexOf (k [0])> - 1)" ยังใช้งานได้ซึ่งเป็นประเภทบางประเภทอยู่แล้ว
mguven guven
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.