<rmcreative>

RSS

replaceAll для JavaScript

18 марта 2008

Думаю, многим нехватает в JS такой простой функции, как заменить все вхождения в строке на что-либо. Если это так — у меня для вас подарок.

String.prototype.replaceAll = function(search, replace){
  return this.split(search).join(replace);
}

Пример использования:

alert("test string... test string!".replaceAll('test', 'a'));

Комментарии RSS

  1. В JavaScript есть встроенное средство для замены подстрок - регулярные выражения:

    alert ('test string... test string!'.replace (/test/g, 'a'));

    Причем, регулярные выражения работают в несколько раз быстрее чем split().join(), особенно, если использовать одну замену много раз.

    Я составил простенький тест, определяющий скорость работы обоих способов при 100 000 замен. Вот результаты теста (regexp и split.join) в мс. в разных браузерах:

    • FireFox: 8237 и 24555

    • IE 7: 4056 и 10358

    • Safari: 3463 и 4415

    Правда в Opera ваш способ работает быстрее:

    • Opera: 62204 и 18627

    Привожу коды тестов.

    Тест RegExp:

    var intTimeStart = new Date ().getTime ();
     
      var strInput = "Очень длинная строка... Очень длинная строка... Очень длинная строка... Очень длинная строка...";
      var strOutput = "";
      var reReplacePattern = /строка/g;
      var strReplaceTo = "1234567890";
      for (var intI = 0; intI < 100000; intI++)
        {
        strOutput = strInput.replace (reReplacePattern, strReplaceTo);
        }
     
      var intTimeEnd = new Date ().getTime ();
      var intTimeDelta = intTimeEnd - intTimeStart;
      alert (intTimeDelta);

    Тест split().join ():

    var intTimeStart = new Date ().getTime ();
     
      var strInput = "Очень длинная строка... Очень длинная строка... Очень длинная строка... Очень длинная строка...";
      var strOutput = "";
      var strReplacePattern = "строка";
      var strReplaceTo = "1234567890";
      for (var intI = 0; intI < 100000; intI++)
        {
        strOutput = strInput.split (strReplacePattern).join(strReplaceTo);
        }
     
      var intTimeEnd = new Date ().getTime ();
      var intTimeDelta = intTimeEnd - intTimeStart;
      alert (intTimeDelta);

    Мой вывод: если ОЧЕНЬ важна скорость работы в ОПЕРЕ, пользуемся Вашим способом (split().join()), в остальных - регулярными выражениями: так короче и быстрее работает (кроме Оперы).

    Спасибо.

  2. №108
    Sam
    Sam 02.04.2008, 2:36:34

    Спасибо за тесты. Форматирование поправлю.

  3. №580
    Прохожий
    Прохожий 27.08.2008, 8:05:30

    Если заменяемая подстрока содержит мета-символы регекспа, что будет*

  4. №581
    Прохожий
    Прохожий 27.08.2008, 8:11:06

    Спасибо за гениальную функцию! Вот это наш подход!

  5. №2381
    ff
    ff 06.03.2010, 20:13:12

    мегакруть! спс

  6. №4064
    Johny
    Johny 10.03.2011, 14:03:14

    А как быть, если надо зареплэейсить напрмер вот это: /

  7. №4074
    Sam
    Sam 10.03.2011, 18:20:40

    Экранировать при помощи \.

  8. №4598
    голубцы с говном
    голубцы с говном 10.05.2011, 19:52:58

    спасибо, помогло при использовании структуры someflag="anything" b=a.replaceAll(someflag, "something") а то не знал что ж делать

  9. №5243
    youtube
    youtube 27.08.2011, 13:57:01

    спасибо, очень помогло поставил на поиск. заменяю все пробелы на +

  10. №5256
    Михаил
    Михаил 31.08.2011, 13:25:00

    replace не заменит все совпадения, если искомое выражение является переменной.

  11. №6181
    Dmitry
    Dmitry 27.04.2012, 14:00:12

    Замечу что в nodejs работает быстрее split + join. Примерно в полтора раза.

  12. №6499
     Семен
    Семен 29.07.2012, 16:35:23

    Михаилу: str.replace(new RegExp(someVariable,'g'),replacer);

  13. №6622
    Артем
    Артем 10.09.2012, 17:59:42

    Семен, Ваш пример не сделает с глобал replace если будет так: str.replace(new RegExp('[' +someVariable ']','g'),replacer);

    Или что-то в этом роде.

  14. №7379
    Сергей
    Сергей 11.01.2013, 18:43:38

    Класс! То, что разработчики пропустили - Вы дописали)

  15. №9046
    Фашист
    Фашист 05.06.2014, 23:54:32

    Спасибо тебе, товарищ! Жаль что разработчики JS сами не додумались до такого.

  16. №10755
    Webmonkey
    Webmonkey 15.11.2016, 11:26:14
    String.prototype.replaceAll = function(search, replacement) {
        var target = this;
        return target.replace(new RegExp(search, 'g'), replacement);
    };
  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.