Обрезать строку в JavaScript?

1304

Как мне обрезать строку в JavaScript?

Винод
источник
290
Стоит отметить, что спустя два года после того, как этот вопрос был задан, String.trim () был добавлен в JavaScript 1.8.1 / ECMAScript 5, поддерживается в: Firefox 3.5+, Chrome / Safari 5+, IE9 + (только в стандартном режиме!) Ответ
Скунлиффа
46
String.trim()также отлично работает из коробки в Node.js.
Брэд
47
К String.trim()слову сказать, метод класса не существует в ES5 / Node.js; вместо этого String.prototype.trim()существует метод экземпляра. Использование: ' foo '.trim()нет String.trim(' foo ').
frontendbeauty
39
О боже, это 2013 год, а IE9 в режиме Compat не имеет метода trim () для String!
дбрин
80
Стоит отметить, что в jQuery, $.trim(str)всегда доступен.
Сигморал

Ответы:

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)также доступен и обрабатывает неопределенный / нуль.


Посмотри это:

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? :)

barneytron
источник
1
это только урезает пробел (
новая строка
JQuery 3.5.0 устарел их метод обрезки.
Герберт Питерс
165

Хотя есть несколько правильных ответов выше, следует отметить, что Stringобъект в JavaScript имеет собственный .trim()метод, начиная с ECMAScript 5 . Таким образом, в идеале любая попытка создать прототип метода trim должна действительно проверить, существует ли он первым.

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

Хром: 5+

Опера: 10,5+

Таблица поддержки ECMAScript 5: http://kangax.github.com/es5-compat-table/

scunliffe
источник
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), если можете
Ben Taliadoros
22

Если вы используете jQuery, используйте jQuery.trim()функцию. Например:

if( jQuery.trim(StringVariable) == '')
Способный Псевдоним
источник
20

Flagrant Badassery имеет 11 различных комплектаций с информацией о тестах:

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

Неудивительно, что регулярные выражения работают медленнее, чем традиционные циклы.


Вот мой личный. Этот код старый! Я написал его для JavaScript 1.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 проста с помощью функции 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 Правда, но они все еще имеют широкую поддержку браузера. А полифилл позаботится о любых несоответствиях.
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, " ");
};

Бесстыдно украден у Мэтта Дуэрега .

yckart
источник
11

Теперь вы можете использовать string.trim (), которая является нативной реализацией Javascript.

var orig = "   foo  ";
console.log(orig.trim());//foo

Смотрите также

Эмилио Горт
источник
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 ")

Rab
источник
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, '');
  };
}
Бехнам Мохаммади
источник
Лучший способ объяснить, как сравнить с другими. Но изменить его немного больше, я имею в виду replaceфункцию регулярного выражения. я не понял это полностью. Вы хотели бы объяснить это немного подробнее в регулярном выражении?
muneeb_ahmed
4

Вот очень простой способ:

function removeSpaces(string){
return string.split(' ').join('');
}
HenryDev
источник
1
Вы понимаете, что этот вопрос был задан в 2009 году? : D
GrafiCode 15.10.15
5
Да, я знаю. Но я решил поделиться тем, что я знаю, на случай, если кому-то это понадобится :)
HenryDev
3
Ты понял! дух изучения и обмена вещами - это всегда хорошо!
HenryDev
3
"Привет, мир" -> "Привет, мир"
Чарли Бернс
2
Этот ответ неверен. trimследует удалять только начальные и конечные пробелы (включая вкладки и другие символы). Вместо этого это удаляет все пробелы, в том числе посередине.
mbomb007
4

Использование trim()on String, которое является нативным, может быть самым простым способом:

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

console.log(trimmedFullName);

Алиреза
источник
3

Вы можете просто объявить вашу переменную как строку и использовать ее функцию trim:

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); };
Zesar
источник
1
Это не хорошее решение. Рассмотрим случай, когда загружаются два экземпляра jQuery (общий сценарий с тегами). Когда загружается 2-й экземпляр 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).

simhumileco
источник
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));
Makyen
источник
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])
plavozont
источник
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);
AnaMaria
источник
-4

Мой использует одно регулярное выражение для поиска случаев, когда необходимо обрезание, и использует результаты этого регулярного выражения для определения желаемых границ подстроки:

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. Насколько хорош захват в регулярном выражении? средний срок, выходное значение, потенциально может быть очень длинным. я не был готов к банкротству, что захват всех регулярных выражений не будет препятствовать захвату ввода в пару сотен килобайт, но я также не тестировал (слишком много времени выполнения, извините!). второй ВСЕГДА запускает захват; если ваш движок может сделать это без удара, возможно, с использованием некоторых из вышеперечисленных методов веревочной веревки, наверняка используйте его!

rektide
источник
-7

Для IE9 + и других браузеров

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}
Codler
источник