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

1252

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

  • 288
    Стоит отметить, что через два года после того, как этот вопрос был задан, String.trim () был добавлен в JavaScript 1.8.1 / ECMAScript 5, поддерживается в: Firefox 3.5+, Chrome / Safari 5+, IE9 + (только в стандартном режиме!) Ответ Скуллиффа: stackoverflow.com/a/8522376/8432
  • 45
    String.trim() также отлично работает из коробки в Node.js.
Показать ещё 8 комментариев
Теги:
string
trim

25 ответов

864
Лучший ответ

Все браузеры с 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, '');
        };
    })();
}

Видеть это:

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,' ');};
  • 84
    Стоит отметить, что в jQuery $.trim(str) всегда доступен.
454

Обрезка из jQuery удобна, если вы уже используете эту фреймворк.

$.trim('  your string   ');

Я часто использую jQuery, поэтому обрезка строк с ним естественна для меня. Но возможно ли, что есть реакция на jQuery?:)

  • 0
    это только обрезка пробелов (новая строка) .. он не работает как php trim, где вы также можете обрезать символы
162

Хотя есть несколько правильных ответов выше, следует отметить, что объект 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.aspx

Chrome: 5 +

Opera: 10.5 +

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

125

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

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

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

Простая версия здесь Что такое общая функция для обрезки JavaScript?

function trim(str) {
        return str.replace(/^\s+|\s+$/g,"");
}
27

Я знаю, что этот вопрос задан на три года назад. Теперь был добавлен изначально в JavaScript. Для экземпляра вы можете обрезать непосредственно, как показано ниже,

document.getElementById("id").value.trim();
  • 3
    Это не будет работать в т.е версиях, используйте jQuery methd $ .trim (str), если можете
21

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

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

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

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

Неудивительно, что regexp-based медленнее, чем традиционный цикл.


Вот мой личный. Этот код устарел! Я написал его для 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);
}
  • 2
    Сейчас их 12. Спасибо за отзывы.
13

Используйте собственные методы 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, '');
        };
    }
}
  • 0
    String.trimLeft() и String.trimRight() не являются частью какого-либо стандарта ECMAScript. Кроме того, ваш ответ идентичен принятому ответу на этот вопрос.
  • 1
    @Brad Правда, но они все еще имеют широкую поддержку браузера. А полифилл позаботится о любых несоответствиях.
Показать ещё 7 комментариев
11

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

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

См. также

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

Бесстыдно украден из Matt duereg.

7

Код обрезки angular js project

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

6

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

function removeSpaces(string){
return string.split(' ').join('');
}
  • 1
    Вы понимаете, что этот вопрос был задан в 2009 году? : D
  • 5
    Да, я знаю. Но я решил поделиться тем, что знаю, на случай, если это кому-то понадобится :)
Показать ещё 6 комментариев
4

используйте просто код

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

Если вам все-таки понадобится поддержка старого браузера, который не поддерживает эту функцию, это a polyfill, предложенный MDN:

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

Из предыдущих ответов он отличается добавлением флага m.

Флаг m будет искать текст нескольких линейных. В этом режиме отметка начала и конца шаблона (^ $) вставлена ​​до и после символа новой строки (\n).

1

У меня есть lib, который использует trim. поэтому решил это, используя следующий код.

String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };
  • 1
    Это не хорошее решение. Рассмотрим случай, когда загружаются два экземпляра jQuery (общий сценарий с тегами). Когда загружается второй экземпляр jQuery, он устанавливает .trim() метод .trim() равным собственному String.prototype.trim который уже был настроен для return jQuery.trim(this) , создавая переполнение стека.
0

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

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

console.log(trimmedFullName);
0

Вы можете сделать это, используя простой JavaScript:

function trimString(str, maxLen) {
if (str.length <= maxLen) {
return str;
}
var trimmed = str.substr(0, maxLen);
return trimmed.substr(0, trimmed.lastIndexOf(' ')) + '…';
}

// Let test it

sentenceOne = "too short";
sentencetwo = "more than the max length";

console.log(trimString(sentenceOne, 15));
console.log(trimString(sentencetwo, 15));

Вот несколько примеров обрезать строку с использованием JavaScript.

0

Я написал эту функцию для обрезки, когда функция .trim() была недоступна в JS еще в 2008 году. Некоторые из старых браузеров по-прежнему не поддерживают функцию .trim(), и я надеюсь, что эта функция может помочь кто-то.

ФУНКЦИЯ 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);
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

Не знаю, какие ошибки могут скрываться здесь, но я использую это:

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])
-5

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

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

есть две ставки производительности, которые я сделал в этих импланах:

  • выполняет ли реализация подстроки исходные данные строки? если это так, то в первом случае, когда строка должна быть обрезана, происходит двойное обход, сначала в регулярном выражении (которое, возможно, должно быть частичным), и второе в извлечении подстроки. мы надеемся, что реализация подстроки ссылается только на исходную строку, поэтому операции, подобные подстроке, могут быть почти бесплатными. крест-пальцы

  • Насколько хорош захват в regex impl? средний срок, выходное значение, потенциально может быть очень большим. я не был готов к банку, что все захваты regex impls не будут препятствовать захвату ввода нескольких сотен KB, но я также не тестировал (слишком много времени выполнения, извините!). второй ВСЕГДА запускает захват; если ваш движок может сделать это без хита, возможно, используя некоторые из вышеперечисленных методов построения строк, обязательно используйте USE IT!

-8

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

function trim(text) {
    return (text == null) ? '' : ''.trim.call(text);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню