Обріжте пробіли від початку та до кінця рядка


152

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

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

Будь-які ідеї?


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); попередження ('-' + s + '-'); // це працює так, вам не потрібні пароні або квадратні дужки.
екернер

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()найкращий спосіб досягти того, що задається питанням.


Стівен Левітан проаналізував багато різних можливостей використання trimJavascript з точки зору продуктивності.

Його рекомендація:

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

"якщо ви хочете надзвичайно швидко обробляти довгі рядки у всіх браузерах".

Список літератури


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

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

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метод був введений у специфікацію 5-го видання ECMAScript , деякі реалізації вже включають цей метод, тому найкращим способом є виявлення нативного втілення та оголошення його лише у тому випадку, якщо воно недоступне:

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

Тоді ви можете просто:

title = title.trim();

1
Мене завжди трохи насторожує цей мем перевірки, чи властивість є функцією. Якщо це не функція, чи правильна поведінка насправді її перезаписати? Можливо, у такому випадку вам слід нанести помилку.
kojiro

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." }
kojiro

34

Я знаю, що це стара публікація, але я просто подумав, що поділюсь нашим рішенням. У пошуках найкоротшого коду (не всі просто люблять короткий вираз), замість цього можна використовувати:

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

BTW: Я пройшов цей самий тест через посилання, яке ділилося вище blog.stevenlevithan.com - Швидше обробка JavaScript і ця картина перемогла всі інші руки!

Використовуючи IE8, додали тест як тест13. Результати:

Оригінальна довжина: 226002
обробка1: 110ms (довжина: 225994)
trim2: 79ms (довжина: 225994)
trim3: 172ms (довжина: 225994)
trim4: 203ms (довжина: 225994)
trim5: 172ms (length: 225994)
trim6: 312ms (length: 225994)
trim7: 203ms (довжина: 225994)
trim8: 47ms (довжина: 225994)
trim9: 453ms (довжина: 225994)
trim10: 15ms (довжина: 225994)
trim11: 16ms (довжина: 225994)
trim12: 31ms (довжина: 225994)
обробка13: 0 мс (довжина: 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

Ось мій поточний код, 2-й рядок працює, якщо я коментую 3-й рядок, але не працюю, якщо я залишу його як є.

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, '-');

видаліть другий і третій рядок і використовуйте код з полігеноматеріалів, page_title = trim1 (page_title);
мураха

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

@chad так. Щоб створити URL-адреси слизу на ходу, щоб користувачі могли бачити, як виглядатиме їх URL. Подібно до того, як Wordpress робить це під час створення нових публікацій блогу.
Джеймс Джефрі


2

jQuery.trim ("привіт, як справи?");

:)


2
Схоже, ви можете зробити смішно, але майте на увазі, що люди, читаючи цей коментар, можуть спокуситись скористатись вашим рішенням і рухатися далі.
комердилімітовано

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

2

Коли DOM повністю завантажений, ви можете додати це до всіх текстових полів. У мене ніколи не було ситуації, коли мені потрібно було подати провідний чи кінцевий простір, тому все це в усьому світі працювало на мене ...

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

вимагає jQuery. Ще одне питання (я його не перевіряв): чи blurнасправді виникає перед поданням, коли я перебуваю в полях і натискаю <kbd> ввести </kbd>, щоб надіслати форму?
аменти

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/.
аменти

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