Обрезать пробелы от начала и до конца строки


152

Я пытаюсь найти способ обрезать пробелы от начала и конца строки заголовка. Я использовал это, но это не похоже на работу:

title = title.replace(/(^[\s]+|[\s]+$)/g, '');

Любые идеи?


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); оповещение ('-' + s + '-'); // это работает так, вам не нужны скобки или квадратные скобки.
ekerner

2
Javascript уже .trimвстроен, так что это ответ для современных браузеров: stackoverflow.com/a/3000900/29182
Ziggy

См. Эту статью: javascriptstutorial.com/blog/trim-string

function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; }
Badri Gs

Ответы:


216

Примечание. Начиная с 2015 года все основные браузеры (включая IE> = 9) поддерживают String.prototype.trim () . Это означает, что в большинстве случаев простое выполнение str.trim()является лучшим способом достижения того, что задает вопрос.


Стивен Левитан проанализировал множество различных реализаций trimв Javascript с точки зрения производительности.

Его рекомендация:

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

для «реализации общего назначения, которая является быстрой кросс-браузерной», и

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

msgstr "если вы хотите обрабатывать длинные строки исключительно быстро во всех браузерах".

Ссылки


21
Новые Safari (5), Chrome (5), Firefox (3.6) и Opera (10.5) поддерживают собственный метод обрезки строк. В таком случае я бы назначил метод String.prototype, если он не существует, а не новую глобальную функцию.
Кеннебек

14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
Кодзиро

3
Я сомневаюсь, что после недавних улучшений производительности javascript этот тест все еще актуален или надежен, как это было во время этого ответа.
Эдуардо

2
почему вы используете двойные белые символы? ака почему это регулярное выражение, /^\s\s*/а не это/^\s*/
Aemonge

Почему trim1и trim11?
Марти Кортес

68

Если вы используете jQuery - это вариант:

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

или просто:

$.trim(string);

48

Как упомянуто @ChaosPandion , String.prototype.trimметод был введен в Спецификацию ECMAScript 5-го издания , некоторые реализации уже включают этот метод, поэтому лучший способ - обнаружить собственную реализацию и объявить ее, только если она недоступна:

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

Тогда вы можете просто:

title = title.trim();

1
Меня всегда немного смущает этот мем проверки, является ли свойство функцией. Если это не функция, то правильно ли ее перезаписывать? Возможно, вам следует выдать ошибку в этом случае.
Кодзиро

1
@kojiro, ну, может быть , метание ошибку был бы хорошо, но я вижу это так: я пытаюсь сделать соответствующие спецификации подкладки , и если String.prototype.trimэто не функция, она неString.prototype.trim метод , описанный на ECMAScript 5th Edition Спецификация, спецификация гарантирует, что trimэто функциональный объект в средах ES5.
CMS

7
throw { name: "UnlikelyPolyfillException", message: "Did someone really write a property on the String prototype named 'trim' that isn't a ECMA 5 compatible shim? Come on now, that's crazy." }
Кодзиро

34

Я знаю, что это старый пост, но просто подумал, что поделюсь нашим решением. В поисках кратчайшего кода (разве не все любят лаконичное регулярное выражение) можно использовать:

title = title.replace(/(^\s+|\s+$)/g, '');

Кстати, я провел этот же тест по ссылке, указанной выше на blog.stevenlevithan.com - более быстрая обрезка JavaScript и этот шаблон побил все другие РУКИ!

Используя IE8, добавил тест как test13. Результаты были:

Оригинальная длина: 226002
trim1: 110ms (длина: 225994)
trim2: 79 мс (длина: 225994)
trim3: 172ms (длина: 225994)
trim4: 203ms (длина: 225994)
TRIM5: 172ms (длина: 225994)
trim6: 312ms (длина: 225994)
trim7: 203ms (длина: 225994)
trim8: 47ms (длина: 225994)
trim9: 453ms (длина: 225994)
trim10: 15мс (длина: 225994)
trim11: 16мс (длина: 225994)
trim12: 31ms (длина: 225994)
trim13: 0ms (длина: 226002)



11

Здесь это должно делать все, что вам нужно

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

\ s \ s * кажется избыточным, так как есть \ s +, но это немного быстрее
CaffGeek

4

Вот некоторые методы, которые я использовал в прошлом для обрезки строк в js:

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

RegExp ^[\s*]+совпадает *в начале строки, так что ваша функция обрезается "*** Foo"до "Foo".
Фердинанд Бейер

наверное :) интересно, почему никто не жаловался ... Давным-давно я написал этот код, и он используется в en.wikipedia.org/wiki/Wikipedia:Twinkle . Теперь, когда вы указываете, это очевидно.
Азатот

4

Вот мой текущий код, вторая строка работает, если я комментирую третью строку, но не работает, если я оставляю все как есть.

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

удалите 2-ю и 3-ю строку и используйте код из полигенных смазок, page_title = trim1 (page_title);
Муравей

так в конечном итоге вы пытаетесь очистить эту строку, чтобы обрезать ее, использовать буквенно-цифровые символы и тире вместо пробелов в качестве разделителей?
CaffGeek

@ чад да. Создавать URL-адреса слагов на лету, чтобы пользователи могли видеть, как будет выглядеть их URL. Подобно тому, как это делает Wordpress при создании новых постов в блоге.
Джеймс Джеффри


2

jQuery.trim ("привет, как дела?");

:)


2
Похоже, вы можете сделать смешной, но имейте в виду, что люди, читающие этот комментарий, могут испытать соблазн использовать ваше решение и двигаться дальше.
commadelimited

$ .trim ("бла-бла-бла"); правильно возвращает «бла-бла-бла»
RAY

2

Когда DOM полностью загружен, вы можете добавить его ко всем текстовым полям. У меня никогда не было ситуации, когда мне нужно было указывать лидирующие или конечные пробелы, поэтому все это время для меня работало глобально ...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

требует JQuery. Другой вопрос (я его не проверял): blurдействительно ли происходит перед отправкой, когда я нахожусь в полях и нажимаю <kbd> enter </ kbd>, чтобы отправить форму?
amenthes

2

Это то, что предлагает JavaScript Архитектор / Гуру Дуглас Крокфорд.

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

Примечание: вы должны определить «метод» для Function.prototype.

альтернативно

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

title.trim();    // returns trimmed title

наблюдение

В последних браузерах метод обрезки включен по умолчанию. Так что вам не нужно добавлять это явно.

Основные браузеры Chrome, Firefox, Safari и т. Д. Поддерживают метод обрезки . Проверено в Chrome 55.0.2883.95 (64-разрядная версия), Firefox 51.0.1 (64-разрядная версия), Safari 10.0 (12602.1.50.0.10).


1
var word = " testWord ";   //add here word or space and test

var x = $.trim(word);

if(x.length > 0)
    alert('word');
else
    alert('spaces');

0

рекурсивная попытка для этого

function t(k){ 
    if (k[0]==' ') {
        return t(k.substr(1,k.length));
    } else if (k[k.length-1]==' ') {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

позвоните так:

t("      mehmet       "); //=>"mehmet"

если вы хотите отфильтровать специальные символы, вы можете определить строку списка:

function t(k){
    var l="\r\n\t "; //you can add more chars here.
    if (l.indexOf(k[0])>-1) {
        return t(k.substr(1,k.length));
    } else if (l.indexOf(k[k.length-1])>-1) {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

Есть тонкое отличие от того, что просят! Вы проверяете для пространства ' ', но речь идет о белом пространстве в целом, в том числе "\n", "\t"и других не печатаемых символов, которые подбираются в регулярном выражении путем /\s/.
amenthes

тогда вы можете отредактировать условие if как "if (" \ t \ r \ n ".indexOf (k [0])> - 1)", но оно работает, это уже определенные типы.
Мгвен Гувен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.