Cắt chuỗi trong JavaScript?


1304

Làm cách nào để cắt một chuỗi trong JavaScript?


290
Điều đáng nói là hai năm sau khi câu hỏi này được hỏi rằng String.trim () đã được thêm vào nguyên bản trong JavaScript 1.8.1 / ECMAScript 5, được hỗ trợ trong: Firefox 3.5+, Chrome / Safari 5+, IE9 + (chỉ trong chế độ Tiêu chuẩn!) câu trả lời của scunliffe: stackoverflow.com/a/8522376/8432
wweicker

46
String.trim()cũng hoạt động tốt trong hộp trong Node.js.
Brad

47
Đối với nitpick : String.trim(), phương thức lớp, không tồn tại trong ES5 / Node.js; thay vào đó, String.prototype.trim()phương thức cá thể, tồn tại. Cách sử dụng : ' foo '.trim(), không String.trim(' foo ').
frontendbeauty

39
OMG, đó là 2013 và IE9 trong chế độ compat không có phương thức trim () trên String!
dbrin

80
Đáng lưu ý rằng trong jQuery, $.trim(str)luôn có sẵn.
Sygmoral

Câu trả lời:


893

Tất cả các trình duyệt kể từ IE9 + đều có trim()phương thức cho chuỗi.

Đối với những trình duyệt không hỗ trợ trim(), bạn có thể sử dụng polyfill này từ 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, '');
        };
    })();
}

Điều đó nói rằng, nếu sử dụng jQuery, $.trim(str)cũng có sẵn và xử lý không xác định / null.


Xem cái này:

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
Đáng lưu ý rằng trong jQuery, $.trim(str)luôn có sẵn.
Sygmoral

481

Việc cắt từ jQuery thuận tiện nếu bạn đang sử dụng khung đó.

$.trim('  your string   ');

Tôi có xu hướng sử dụng jQuery thường xuyên, vì vậy việc cắt xén chuỗi với nó là điều tự nhiên đối với tôi. Nhưng có thể có phản ứng dữ dội với jQuery ngoài kia không? :)


1
điều này chỉ cắt khoảng trắng (dòng mới) .. nó không hoạt động như php trim, nơi bạn cũng có thể cắt các ký tự
Jeffz

jQuery 3.5.0 đã khấu hao phương thức trim của họ.
Herbert Peters

165

Mặc dù có một loạt các câu trả lời đúng ở trên, cần lưu ý rằng Stringđối tượng trong JavaScript có một .trim()phương thức gốc kể từ ECMAScript 5 . Do đó, lý tưởng nhất là bất kỳ nỗ lực nào để tạo nguyên mẫu cho phương thức trim nên thực sự kiểm tra xem liệu nó đã tồn tại trước chưa.

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

Đã thêm nguyên bản trong: JavaScript 1.8.1 / ECMAScript 5

Do đó được hỗ trợ trong:

Firefox: 3,5+

Safari: 5+

Internet Explorer: IE9 + (chỉ ở chế độ Tiêu chuẩn!) Http://bloss.msdn.com/b/ie/archive/2010/06/25/enhified-scripting-in-ie9-ecmascript-5-support-and-more .aspx

Chrome: 5+

Opera: 10,5+

Bảng hỗ trợ ECMAScript 5: http : // Khangax.github.com/es5-compat-table/


128

rất nhiều triển khai có thể được sử dụng. Rõ ràng nhất dường như là một cái gì đó như thế này:

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

" foo bar ".trim();  // "foo bar"


29

Tôi biết câu hỏi này đã được hỏi ba năm trước. Bây giờ, String.trim()đã được thêm vào nguyên bản trong JavaScript. Ví dụ, bạn có thể cắt trực tiếp như sau,

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

3
Điều này sẽ không hoạt động trong các phiên bản tức là, sử dụng jQuery methd $ .trim (str) nếu bạn có thể
Ben Taliadoros

22

Nếu bạn đang sử dụng jQuery, hãy sử dụng jQuery.trim()hàm. Ví dụ:

if( jQuery.trim(StringVariable) == '')

20

Flagrant Badassery có 11 trims khác nhau với thông tin điểm chuẩn:

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

Không đáng ngạc nhiên dựa trên regrec chậm hơn so với vòng lặp truyền thống.


Đây là một cá nhân của tôi. Mã này đã cũ! Tôi đã viết nó cho JavaScript1.1 và Netscape 3 và nó chỉ được cập nhật một chút kể từ đó. (String.charAt được sử dụng ban đầu)

/**
 *  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

Sử dụng các phương pháp Native JavaScript: String.trimLeft(), String.trimRight(), và String.trim().


String.trim()được hỗ trợ trong IE9 + và tất cả các trình duyệt chính khác :

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


String.trimLeft()String.trimRight()không chuẩn, nhưng được hỗ trợ trong tất cả các trình duyệt chính trừ IE

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


Tuy nhiên, hỗ trợ IE rất dễ dàng với một 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 Đúng, nhưng họ vẫn có hỗ trợ trình duyệt rộng. Và polyfill chăm sóc bất kỳ sự mâu thuẫn nào.
Web_Designer

1
Bạn nên xem xét xóa câu trả lời của bạn. Nó không thêm bất cứ điều gì chưa được bao phủ 5x qua các câu trả lời khác đã có ở đây.
Brad

4
@Brad Tôi chưa thấy ai nhắc đến trimLefthay trimRight.
Web_Designer

1
@Brad Tôi thích triển khai JavaScript riêng khi có sẵn. Câu trả lời đó tạo nên của riêng mình lTrim()rTrim()phương pháp.
Web_Designer

1
@Brad Chúng không chuẩn nhưng một số trình duyệt vẫn hỗ trợ chúng, vì vậy trong các trình duyệt đó, không cần tạo polyfill.
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, " ");
};

Không biết xấu hổ bị đánh cắp từ Matt duereg .



7

Cắt mã từ dự án js góc

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

})();

và gọi nó là trim(" hello ")


5

sử dụng mã đơn giản

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

Hỗ trợ trình duyệt

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

Đối với trình duyệt cũ, thêm nguyên mẫu

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

cách tốt nhất để giải thích so với những người khác. Nhưng sửa đổi nó ít hơn tôi có nghĩa là replacechức năng regrec. tôi đã không nhận được nó hoàn toàn. bạn có muốn giải thích thêm một chút về phần regrec không?
muneeb_ahmed

4

Đây là một cách rất đơn giản:

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

1
Bạn nhận ra câu hỏi này đã được hỏi vào năm 2009, phải không? : D
GrafiCode

5
Phải, tôi biết. Nhưng tôi đã quyết định chia sẻ những gì tôi biết trong trường hợp ai đó cần nó :)
HenryDev

3
bạn hiểu rồi tinh thần học hỏi và chia sẻ mọi thứ luôn là một điều tốt!
HenryDev

3
"xin chào thế giới" -> "hellowworld"
Charlie Burns

2
Câu trả lời này là sai. trimchỉ nên xóa khoảng trắng hàng đầu và dấu (bao gồm các tab và các ký tự khác). Điều này thay vào đó loại bỏ tất cả các không gian, bao gồm cả không gian ở giữa.
mbomb007

4

Sử dụng trim()trên String là bản địa có thể là cách dễ nhất:

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

console.log(trimmedFullName);


3

Bạn chỉ có thể khai báo biến của mình dưới dạng chuỗi và sử dụng hàm trim của nó:

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

2

Ngày nay, khá nhiều trình duyệt hỗ trợ String.prototype.trim().

Bạn sử dụng nó như thế này:

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

Trong trường hợp bạn vẫn có thể cần hỗ trợ một trình duyệt cổ không hỗ trợ tính năng này, đây là một polyfill được đề xuất bởi MDN:

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

1

Tôi có một lib sử dụng trim. Vì vậy, giải quyết nó bằng cách sử dụng mã sau đây.

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

1
Đây không phải là một giải pháp tốt. Hãy xem xét trường hợp hai trường hợp của jQuery được tải (một kịch bản phổ biến với các thẻ). Khi phiên bản thứ 2 của jQuery tải, nó sẽ đặt .trim()phương thức của nó bằng với bản gốc String.prototype.trimđã được đặt thành return jQuery.trim(this), do đó tạo ra một tràn ngăn xếp.
Brad M

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

Từ các câu trả lời trước, nó khác nhau thêm cờ m.

Flag msẽ tìm kiếm văn bản của một số tuyến tính. Trong chế độ này, đánh dấu điểm bắt đầu và kết thúc của mẫu ( ^ $) được chèn trước và sau ký tự dòng mới ( \n).


1

Bạn có thể làm điều đó bằng cách sử dụng JavaScript đơn giản:

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

Bây giờ trim () xây dựng trong javascript.

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

Chỉ cần bàn điều khiển hoặc mã in thì tên của bạn cũng sẽ được cắt bớt.


Hãy chắc chắn đọc các bình luận về câu hỏi trước khi đăng câu trả lời không thêm bất kỳ thông tin mới nào. Một số ý kiến ​​hàng đầu là tất cả các mô tả / thảo luận về điều này và có một số lượng lớn các phiếu bầu. Những bình luận này có từ gần 8 năm trước và bản thân câu hỏi đã gần 11 tuổi.
Ross Gurbutt

0

Không biết những gì lỗi có thể ẩn ở đây, nhưng tôi sử dụng điều này:

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

Hoặc cái này, nếu văn bản chứa enter:

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

Một lần thử khác:

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

0

Đây là trong TypeScript:

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

Nó sẽ rơi trở lại regex nếu nguyên mẫu gốc không có sẵn.


0

Tôi đã viết hàm này để cắt, khi hàm .trim () không có sẵn theo cách của JS vào năm 2008. Một số trình duyệt cũ hơn vẫn không hỗ trợ hàm .trim () và tôi hy vọng hàm này có thể giúp được ai đó.

CHỨC NĂNG 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;
}

Giải thích : Hàm trim () chấp nhận một đối tượng chuỗi và xóa mọi khoảng trắng bắt đầu và dấu (khoảng trắng, tab và dòng mới) và trả về chuỗi đã cắt. Bạn có thể sử dụng chức năng này để cắt các đầu vào mẫu để đảm bảo dữ liệu hợp lệ được gửi.

Hàm này có thể được gọi theo cách sau đây làm ví dụ.

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

-4

của tôi sử dụng một regex duy nhất để tìm kiếm các trường hợp cần cắt tỉa và sử dụng các kết quả của regex đó để xác định giới hạn chuỗi con mong muốn:

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
}

một quyết định thiết kế đã đi vào vấn đề này là sử dụng một chuỗi con để thực hiện việc chụp cuối cùng. s / \ ?: // (thực hiện ghi hình giữa kỳ) và đoạn thay thế trở thành:

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

Có hai cược hiệu suất tôi đã thực hiện trong các hàm này:

  1. việc thực hiện chuỗi con sao chép dữ liệu của chuỗi gốc? nếu vậy, trong lần đầu tiên, khi một chuỗi cần được cắt, có một đường truyền kép, đầu tiên là trong biểu thức chính quy (có thể, hy vọng là một phần) và lần thứ hai trong trích xuất chuỗi con. hy vọng việc triển khai chuỗi con chỉ tham chiếu chuỗi gốc, vì vậy các hoạt động như chuỗi con có thể gần như miễn phí. ngón tay chéo

  2. Làm thế nào tốt là chụp trong regex impl? trung hạn, giá trị đầu ra, có thể có khả năng rất dài. Tôi đã không sẵn sàng cho ngân hàng rằng tất cả regex ngụ ý rằng việc bắt giữ sẽ không bị ảnh hưởng khi bắt được vài trăm KB, nhưng tôi cũng không kiểm tra (quá nhiều thời gian chạy, xin lỗi!). LUÔN LUÔN thứ hai chạy một chụp; nếu động cơ của bạn có thể thực hiện việc này mà không cần nhấn, có thể sử dụng một số kỹ thuật tạo chuỗi trên đây, chắc chắn SỬ DỤNG CNTT!


-7

Dành cho IE9 + và các trình duyệt khác

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.