Обрізати рядок у 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 у режимі compat не має методу trim () на String!
дбрин

80
Варто зазначити, що в jQuery $.trim(str)завжди доступний.
Sygmoral

Відповіді:


893

Усі браузери з IE9 + мають trim()метод для рядків.

Для тих браузерів, які не підтримують trim(), ви можете використовувати цю поліфункцію від 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 знецінив їх метод оздоблення.
Герберт Пітерс

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+

Сафарі: 5+

Internet Explorer: IE9 + (лише в стандартному режимі!) Http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more .aspx

Chrome: 5+

Опера: 10,5+

Таблиця підтримки ECMAScript 5: http://kangax.github.com/es5-compat-table/


128

Є багато реалізацій, які можна використовувати. Найбільш очевидним здається щось подібне:

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

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


29

Я знаю, що це запитання було задано три роки тому. Тепер String.trim()його додано в JavaScript. Наприклад, ви можете обрізати безпосередньо наступним чином,

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

3
Ця робота не працюватиме у версіях, використовуйте jQuery methd $ .trim (str), якщо можете
Бен Таліадорос


20

Flagrant Badassery має 11 різних деталей з базовою інформацією:

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

Не дивно, що на основі регулярного випромінювання повільніше, ніж у традиційного циклу.


Ось моя особиста. Цей код старий! Я написав це для 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

Використовуйте методи Native 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 легко за допомогою поліфункції:

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 Правда, але вони все ще мають широку підтримку браузера. І поліфіл піклується про будь-які невідповідності.
Web_Designer

1
Слід розглянути можливість видалення відповіді. Він не додає нічого, що вже не було в 5 разів охоплено іншими відповідями.
Бред

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

Безсоромно викрадено у Метта дуерег .



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. я не зрозумів це повністю. Ви хотіли б пояснити це трохи більше частиною регулярного вибору?
muneeb_ahmed

4

Ось дуже простий спосіб:

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

1
Ви розумієте, що це запитання було задано у 2009 році, чи не так? : D
GrafiCode

5
Так я знаю. Але я вирішив поділитися тим, що знаю, на випадок, коли комусь це потрібно :)
HenryDev

3
ти зрозумів! дух навчання та обміну речами - це завжди добре!
ГенріДев

3
"hello world" -> "helloworld"
Чарлі Бернс

2
Ця відповідь неправильна. trimслід видалити лише пробіли та пробіли (що включає вкладки та інші символи). Це замість цього видаляє всі пробіли, в тому числі і посередині.
mbomb007

4

Використання trim()на рідній струні може бути найпростішим способом:

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'

Якщо вам все-таки знадобиться підтримувати стародавній браузер, який не підтримує цю функцію, це поліфіл, запропонований MDN:

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

1

У мене є мочка, яка використовує обробку. тому вирішили це за допомогою наступного коду.

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

1
Це не гарне рішення. Розглянемо випадок, коли завантажуються два екземпляри jQuery (загальний сценарій з тегами). Коли другий екземпляр jQuery завантажується, він встановить його .trim()метод, рівний нативній, String.prototype.trimяка вже була встановлена return jQuery.trim(this), створюючи таким чином переповнення стека.
Бред М

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

Тепер обробіть trim () в JavaScript.

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

просто консоль або код для друку, тоді ваше ім’я також буде підстрижене.


Обов’язково прочитайте коментарі до цього питання, перш ніж публікувати відповідь, яка не додає нової інформації. Кілька перших коментарів описують / обговорюють це і мають велику кількість голосів. Ці коментарі майже 8 років тому, а самому питанню майже 11 років.
Росс Гурбютт

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

Він повернеться до регулярного виразу, якщо власний прототип не буде доступний.


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

Пояснення : функція trim () приймає об'єкт рядка та видаляє всі початкові та кінцеві пробіли (пробіли, вкладки та нові рядки) та повертає обрізану рядок. Ви можете використовувати цю функцію для обрізки входів форми, щоб забезпечити надсилання дійсних даних.

Функцію можна назвати наступним чином як приклад.

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

-4

mine використовує єдиний регулярний вираз, щоб шукати випадки, коли обрізка необхідна, і використовує результати цього регексу для визначення бажаних меж підрядки:

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. чи реалізує реалізація підрядків вихідні дані рядка? якщо так, то в першому, коли потрібно обрізати рядок, є подвійний обхід, спочатку в регулярному вираженні (який, сподіваємось, може бути частковим), а в другому - у вилученні підрядків. сподіваємось, що реалізація підрядка посилається лише на початковий рядок, тому такі операції, як підрядка, можуть бути майже безкоштовними. схрестити пальці

  2. наскільки хорошим є захоплення в регулярному виразі імпл? середній термін, вихідна величина, потенційно може бути дуже довгим. Я не був готовий зафіксувати, що захоплення всіх регекс-імпульсів не буде працювати при захопі входу на пару сотень КБ, але я також не перевіряв (занадто багато часу виконання, вибачте!). другий ЗАВЖДИ виконує захоплення; якщо ваш двигун може це зробити, не вдарившись, можливо, використовуючи деякі з перерахованих вище методів стринг-ропінгу, напевно ВИКОРИСТУЙТЕ!


-7

Для IE9 + та інших браузерів

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.