ตัดแต่งสตริงใน JavaScript หรือไม่


1304

ฉันจะตัดแต่งสตริงใน JavaScript ได้อย่างไร


290
เป็นมูลค่าการกล่าวถึงสองปีหลังจากคำถามนี้ถูกถามว่า String.trim () ถูกเพิ่มเข้ามาใน JavaScript 1.8.1 / ECMAScript 5, รองรับใน: Firefox 3.5+, Chrome / Safari 5+, IE9 + (ในโหมดมาตรฐานเท่านั้น!) ดู คำตอบของ scunliffe: stackoverflow.com/a/8522376/8432
wweicker

46
String.trim()ยังใช้งานได้ดีในกล่องใน Node.js
แบรด

47
สำหรับ nitpick: String.trim()วิธีการเรียนไม่มีใน ES5 / Node.js; String.prototype.trim()มีวิธีการอินสแตนซ์แทนอยู่แล้ว การใช้งาน: ไม่' foo '.trim() String.trim(' foo ')
frontendbeauty

39
OMG มันเป็นปี 2013 และ IE9 ในโหมดที่เข้ากันได้ไม่มีวิธีการ trim () ใน String!
dbrin

80
เป็นที่น่าสังเกตว่าใน jQuery $.trim(str)มีให้ใช้งานเสมอ
Sygmoral

คำตอบ:


893

เบราว์เซอร์ทั้งหมดตั้งแต่ IE9 + มีtrim()วิธีสำหรับสตริง

สำหรับเบราว์เซอร์ที่ไม่รองรับtrim()คุณสามารถใช้ polyfill นี้จาก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, '');
        };
    })();
}

ที่กล่าวว่าถ้าใช้jQuery, $.trim(str)ยังมีอยู่และจับไม่ได้กำหนด / null


ดูนี่:

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

87
เป็นที่น่าสังเกตว่าใน jQuery $.trim(str)มีให้ใช้งานเสมอ
Sygmoral

481

การตัดแต่งจากjQueryสะดวกถ้าคุณใช้กรอบงานนั้นอยู่แล้ว

$.trim('  your string   ');

ฉันมักจะใช้ jQuery บ่อยครั้งดังนั้นการตัดสายด้วยมันจึงเป็นเรื่องธรรมดาสำหรับฉัน แต่เป็นไปได้ไหมว่ามีแบ็กสแลชต่อต้าน jQuery อยู่ที่นั่น? :)


1
นี้เท่านั้นที่จดจ้องช่องว่าง (ขึ้นบรรทัดใหม่) .. มันไม่ทำงานเช่นการตัดแต่ง PHP, ที่คุณสามารถตัดตัวละครได้เป็นอย่างดี
Jeffz

jQuery 3.5.0 คิดค่าเสื่อมราคาวิธีการตัดแต่งของพวกเขา
Herbert Peters

165

แม้ว่าจะมีพวงของคำตอบที่ถูกต้องดังกล่าวข้างต้นก็ควรจะตั้งข้อสังเกตว่าStringวัตถุใน JavaScript มีพื้นเมือง.trim()วิธี ณECMAScript 5 ดังนั้นความพยายามใด ๆ ในการสร้างต้นแบบของวิธีการเล็มควรตรวจสอบเพื่อดูว่ามันมีอยู่แล้วก่อน

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

เพิ่มเข้ามาใน: JavaScript 1.8.1 / ECMAScript 5

ได้รับการสนับสนุนใน:

Firefox: 3.5+

Safari: 5+

Internet Explorer: IE9 + (ในโหมดมาตรฐานเท่านั้น!) http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more เพิ่มเติม ขอบ

Chrome: 5+

Opera: 10.5+

ตารางสนับสนุน ECMAScript 5: http://kangax.github.com/es5-compat-table/




29

ฉันรู้ว่าคำถามนี้ถูกถามไปแล้วสามปีตอนนี้String.trim()ถูกเพิ่มเข้ามาใน JavaScript ตัวอย่างเช่นคุณสามารถตัดต่อได้โดยตรงดังต่อไปนี้

document.getElementById("id").value.trim();

3
สิ่งนี้จะไม่ทำงานในเวอร์ชันต่างๆเช่นใช้ jQuery methd $ .trim (str) หากคุณทำได้
Ben Taliadoros


20

ชัดแจ้ง Badasseryมี 11 ภายนอกข้อมูลรถด้วยข้อมูลมาตรฐาน:

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

การใช้ regexp ที่ไม่น่าแปลกใจนั้นช้ากว่าลูปดั้งเดิม


นี่คือส่วนบุคคลของฉัน รหัสนี้เก่า! ฉันเขียนมันสำหรับ JavaScript1.1 และ Netscape 3 และได้รับการปรับปรุงเพียงเล็กน้อยตั้งแต่นั้นมา (เดิมใช้ 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);
}

14

ใช้วิธีการ JavaScript พื้นเมือง: String.trimLeft(), และString.trimRight()String.trim()


String.trim()รองรับIE9 + และเบราว์เซอร์หลักอื่น ๆ ทั้งหมด :

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


String.trimLeft()และString.trimRight()ไม่ได้มาตรฐาน แต่ได้รับการสนับสนุนในเบราว์เซอร์หลักทั้งหมดยกเว้น IE

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


รองรับ IE ได้ง่ายด้วย 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, '');
        };
    }
}

1
@Brad True แต่พวกเขายังคงรองรับเบราว์เซอร์ที่หลากหลาย และโพลีฟิลจะดูแลความไม่สอดคล้องกันใด ๆ
Web_Designer

1
คุณควรพิจารณาลบคำตอบของคุณ มันไม่ได้เพิ่มอะไรที่ยังไม่ได้ครอบคลุม 5x คำตอบอื่น ๆ แล้วที่นี่
แบรด

4
@Brad ผมยังไม่เห็นใครพูดถึงหรือtrimLeft trimRight
Web_Designer

1
@Brad ฉันชอบการใช้งาน JavaScript ดั้งเดิมหากมี คำตอบที่ทำให้การขึ้นของตัวเองlTrim()และrTrim()วิธีการ
Web_Designer

1
@Brad พวกเขาไม่ได้มาตรฐาน แต่บางเบราว์เซอร์ยังคงสนับสนุนดังนั้นในเบราว์เซอร์เหล่านั้นไม่จำเป็นต้องสร้างโพลีฟิลล์
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, " ");
};

ขโมยลงคอจากแมตต์ duereg



7

ตัดรหัสจากโครงการjs เชิงมุม

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

})();

และเรียกมันว่า trim(" hello ")


5

ใช้รหัสง่ายๆ

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

รองรับเบราว์เซอร์

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

สำหรับเบราว์เซอร์เก่าให้เพิ่มต้นแบบ

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

วิธีที่ดีที่สุดที่จะอธิบายว่าเป็นการเปรียบเทียบกับ others.but ปรับเปลี่ยนมันมากขึ้นฉันหมายถึงreplaceฟังก์ชั่น regexp ฉันไม่ได้รับมันอย่างสมบูรณ์ คุณต้องการที่จะอธิบายมันเป็นส่วน regexp อีกเล็กน้อยหรือไม่
muneeb_ahmed

4

นี่เป็นวิธีที่ง่ายมาก:

function removeSpaces(string){
return string.split(' ').join('');
}

1
คุณรู้หรือไม่ว่าคำถามนี้ถูกถามในปี 2009 คุณทำ : D
GrafiCode

5
ฉันรู้แล้ว แต่ผมตัดสินใจที่จะแบ่งปันสิ่งที่ฉันรู้ในกรณีที่มีคนต้องการมัน :)
HenryDev

3
คุณได้รับมัน! วิญญาณแห่งการเรียนรู้และแบ่งปันสิ่งต่าง ๆ เป็นสิ่งที่ดีเสมอ!
HenryDev

3
"สวัสดีโลก" -> "helloworld"
Charlie Burns

2
คำตอบนี้ผิด trimควรลบช่องว่างนำหน้าและต่อท้ายเท่านั้น(ซึ่งรวมถึงแท็บและอักขระอื่น ๆ ) สิ่งนี้จะลบช่องว่างทั้งหมดรวมถึงที่อยู่ตรงกลางแทน
mbomb007

4

ใช้trim()บน Stringซึ่งเป็นชนพื้นเมืองอาจจะเป็นวิธีที่ง่ายที่สุด:

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

console.log(trimmedFullName);


3

คุณสามารถประกาศตัวแปรของคุณเป็นสตริงและใช้ฟังก์ชั่นการตัดแต่ง:

var str = new String('my string'); 
str= str.trim();

2

ทุกวันนี้เบราว์เซอร์ทุกตัวรองรับได้มาก String.prototype.trim()ได้มาก

คุณใช้มันแบบนี้:

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

ในกรณีที่คุณยังอาจจำเป็นต้องสนับสนุนเบราว์เซอร์โบราณที่ไม่รองรับคุณสมบัตินี้นี่คือpolyfillที่ MDN แนะนำโดย:

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

1

ฉันมี lib ที่ใช้การตกแต่ง แก้ไขได้โดยใช้รหัสต่อไปนี้

String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };

1
นี่ไม่ใช่ทางออกที่ดี พิจารณากรณีที่โหลด jQuery สองอินสแตนซ์ (สถานการณ์ทั่วไปที่มีแท็ก) เมื่ออินสแตนซ์ที่สองของการโหลด jQuery มันจะตั้งค่าเป็น.trim()วิธีที่เท่ากับเนทีฟString.prototype.trimที่ตั้งค่าไว้return jQuery.trim(this)แล้วดังนั้นจึงสร้างสแต็กโอเวอร์โฟลว์
แบรด M

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

จากคำตอบก่อนหน้านี้มันแตกต่างเพิ่มการตั้งค่าสถานะ mจากคำตอบก่อนหน้านี้มันแตกต่างเพิ่มธง

ตั้งค่าสถานะmจะค้นหาข้อความของหลาย ๆ เชิงเส้น ในโหมดนี้เครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของรูปแบบ ( ^ $) จะถูกแทรกก่อนและหลังอักขระบรรทัดใหม่ ( \n)


1

คุณสามารถทำได้โดยใช้ JavaScript ธรรมดา:

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

1

ตอนนี้ตัดแต่ง () สร้างในจาวาสคริปต์

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

เพียงคอนโซลหรือพิมพ์รหัสจากนั้นชื่อของคุณจะถูกตัดแต่งเช่นกัน


อย่าลืมอ่านความคิดเห็นเกี่ยวกับคำถามก่อนโพสต์คำตอบที่ไม่ได้เพิ่มข้อมูลใหม่ ความคิดเห็นหลายประการด้านบนล้วนเป็นคำอธิบาย / การพูดคุยและมีการโหวตจำนวนมาก ความคิดเห็นเหล่านี้มาจากเกือบ 8 ปีที่แล้วและคำถามนั้นอายุเกือบ 11 ปี
Ross Gurbutt

0

ไม่ทราบว่ามีข้อบกพร่องอะไรซ่อนอยู่ที่นี่ แต่ฉันใช้สิ่งนี้:

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

หรือสิ่งนี้หากข้อความมีการป้อน:

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

ลองอีกครั้ง:

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

0

นี่คือใน TypeScript:

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

มันจะถอยกลับไปยัง regex หากต้นแบบดั้งเดิมไม่พร้อมใช้งาน


0

ฉันได้เขียนฟังก์ชั่นนี้สำหรับตัดแต่งเมื่อฟังก์ชั่น. trim () ไม่สามารถใช้ได้ในแบบ JS ในปี 2008 เบราว์เซอร์รุ่นเก่าบางรุ่นยังไม่รองรับฟังก์ชัน. trim () และฉันหวังว่าฟังก์ชันนี้อาจช่วยใครบางคน

ฟังก์ชั่นตัดแต่ง

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

คำอธิบาย : ฟังก์ชั่นการตัดแต่ง () ยอมรับวัตถุสตริงและลบ whitespaces เริ่มต้นและต่อท้ายใด ๆ (ช่องว่างแท็บและการขึ้นบรรทัดใหม่) และส่งกลับสตริงที่ถูกตัด คุณสามารถใช้ฟังก์ชั่นนี้เพื่อตัดแต่งอินพุตแบบฟอร์มเพื่อให้แน่ใจว่าข้อมูลที่ถูกต้องจะถูกส่ง

ฟังก์ชั่นสามารถเรียกได้ในลักษณะดังต่อไปนี้เป็นตัวอย่าง

form.elements[i].value = trim(form.elements[i].value);

-4

Mine ใช้ regex เพียงตัวเดียวเพื่อค้นหากรณีที่จำเป็นต้องทำการเล็มและใช้ผลลัพธ์ของ regex เพื่อกำหนดขอบเขตย่อยที่ต้องการ:

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
}

การตัดสินใจออกแบบครั้งเดียวที่ใช้สิ่งนี้คือการใช้สตริงย่อยเพื่อทำการจับภาพครั้งสุดท้าย s / \?: // (ทำการจับภาพระยะกลาง) และชิ้นส่วนทดแทนจะกลายเป็น:

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

มีสองเดิมพันประสิทธิภาพที่ฉันทำในนัยเหล่านี้:

  1. การใช้งานซับสตริงคัดลอกข้อมูลของสตริงดั้งเดิมหรือไม่ ถ้าเป็นเช่นนั้นในครั้งแรกเมื่อสตริงจะต้องมีการตัดทอนมีการสำรวจเส้นทางสองครั้งแรกใน regex (ซึ่งอาจหวังว่าจะเป็นบางส่วน) และที่สองในการสกัดสตริงย่อย หวังว่าการใช้งานสายอักขระย่อยจะอ้างอิงสายอักขระดั้งเดิมเท่านั้นดังนั้นการดำเนินการเช่นสายอักขระย่อยสามารถเกือบฟรี นิ้วข้าม

  2. การจับภาพใน regex นั้นดีแค่ไหน? ในระยะกลางมูลค่าส่งออกอาจมีความยาวมาก ฉันยังไม่พร้อมที่จะฝากธนาคารที่ regex ทั้งหมดแสดงให้เห็นว่าการจับภาพจะไม่หยุดชะงักที่การจับการป้อนข้อมูลสองร้อย KB แต่ฉันก็ยังไม่ได้ทดสอบ ครั้งที่สองทำการจับภาพเสมอ หากเครื่องยนต์ของคุณสามารถทำสิ่งนี้ได้โดยไม่ต้องกดปุ่มบางทีอาจใช้เทคนิคสตริง - โรป - เทคนิคที่กล่าวมาข้างต้นเพื่อใช้งานอย่างแน่นอน!


-7

สำหรับ IE9 + และเบราว์เซอร์อื่น ๆ

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.