Как я могу выполнить str_replace в JavaScript, заменив текст в JavaScript?

137

Я хочу использовать str_replaceили аналогичную альтернативу для замены текста в JavaScript.

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write("new_text");

должен дать

this is some sample text that i dont want to replace

Если вы собираетесь использовать регулярное выражение, каковы последствия для производительности по сравнению со встроенными методами замены.

Виш
источник
3
Странно, но никто не заметил, что PHP str_replaceтакже принимает два массива одинаковой длины, где каждая строка в первом массиве заменяется строкой во втором массиве с тем же индексом. Пожалуйста, посетите stackoverflow.com/a/5069776/296430, чтобы узнать о единственной правильной функции, которую я нашел до сих пор, которая имитирует это точное поведение в javascript.
Жюль Колле
2
@JulesColle, этот ответ часто терпит неудачу - посмотрите, почему / когда он терпит неудачу, и лучшее решение здесь: stackoverflow.com/a/37949642/445295
Стивен М. Харрис
1
Если вам нужна высокая совместимость - включая причуды - с версией php ... взгляните на github.com/kvz/locutus/blob/master/src/php/strings/ ...
Дуг Коберн

Ответы:

12

Использование регулярного выражения для замены строки значительно медленнее, чем использование замены строки.
Как показано на JSPerf , вы можете иметь разные уровни эффективности для создания регулярного выражения, но все они значительно медленнее, чем простая замена строки. Регулярное выражение работает медленнее, потому что :

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

Для простого тестового запуска на странице JS perf я задокументировал некоторые результаты:

<script>
// Setup
  var startString = "xxxxxxxxxabcxxxxxxabcxx";
  var endStringRegEx = undefined;
  var endStringString = undefined;
  var endStringRegExNewStr = undefined;
  var endStringRegExNew = undefined;
  var endStringStoredRegEx = undefined;      
  var re = new RegExp("abc", "g");
</script>

<script>
// Tests
  endStringRegEx = startString.replace(/abc/g, "def") // Regex
  endStringString = startString.replace("abc", "def", "g") // String
  endStringRegExNewStr = startString.replace(new RegExp("abc", "g"), "def"); // New Regex String
  endStringRegExNew = startString.replace(new RegExp(/abc/g), "def"); // New Regexp
  endStringStoredRegEx = startString.replace(re, "def") // saved regex
</script>

Результаты для Chrome 68 следующие:

String replace:    9,936,093 operations/sec
Saved regex:       5,725,506 operations/sec
Regex:             5,529,504 operations/sec
New Regex String:  3,571,180 operations/sec
New Regex:         3,224,919 operations/sec

Для полноты этого ответа (заимствования из комментариев) стоит упомянуть, что .replaceзаменяет только первый экземпляр совпадающего символа. Возможна только замена всех экземпляров на //g. Можно утверждать, что компромисс производительности и элегантности кода будет хуже при замене нескольких экземпляров name.replace(' ', '_').replace(' ', '_').replace(' ', '_');или хужеwhile (name.includes(' ')) { name = name.replace(' ', '_') }

TheChetan
источник
Это интересно и имеет смысл, что чистая замена строки быстрее, чем регулярное выражение. Вероятно, стоит упомянуть (как в некоторых ответах), что .replaceзаменяет только первый экземпляр совпадающего символа. Возможна только замена всех экземпляров на //g. Можно утверждать, что компромисс производительности будет хуже при замене нескольких экземпляров name.replace(' ', '_').replace(' ', '_').replace(' ', '_');или хужеwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Лекс
202

Вы бы использовали replaceметод:

text = text.replace('old', 'new');

Очевидно, первый аргумент - это то, что вы ищете. Он также может принимать регулярные выражения.

Просто помните, что это не меняет исходную строку. Он возвращает только новое значение.

sdleihssirhc
источник
4
Большое спасибо за «он только возвращается и не меняется»! Вот из-за чего я долго рвал волосы, пока не наткнулся на ваш комментарий ...
Aditya MP
71
string.replace ('old', 'new') заменит только первый экземпляр 'old' в строке. использование регулярного выражения с флагом 'g', как в ответе realmag777, заменит все экземпляры строки. text = text.replace (/ old / g, 'new') заменит все экземпляры слова 'old'
WNRosenberg
1
как насчет без учета регистра?
Netorica 04
7
^ text.replace (/ old / gi, 'new') заменит все экземпляры 'old' на 'new' без учета регистра (например, 'OLD' и 'oLd' также будут заменены)
arnoudhgz
2
и некоторые документы с этим: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
elad silver
85

Проще:

city_name=city_name.replace(/ /gi,'_');

Заменяет все пробелы на '_'!

realmag777
источник
10
это более точный перевод того, что делает "str_replace" (глобальный). Выбранный ответ заменит только первый экземпляр.
rICh
1
Не забудьте экранировать символы, особенно если вы заменяете экранированный шестнадцатеричный код: \ x27, например, будет.replace(/\\x3B/g,';')
dmayo
18

Все эти методы не изменяют исходное значение, возвращают новые строки.

var city_name = 'Some text with spaces';

Заменяет 1-й пробел на _

city_name.replace(' ', '_'); // Returns: Some_text with spaces

Заменяет все пробелы на _, используя регулярное выражение. Если вам нужно использовать регулярное выражение, я рекомендую протестировать его с помощью https://regex101.com/

city_name.replace(/ /gi,'_');  // Returns: Some_text_with_spaces 

Заменяет все пробелы на _ без регулярного выражения . Функциональный способ.

city_name.split(' ').join('_');  // Returns: Some_text_with_spaces
Лукас Лисис
источник
16

Вы должны написать что-то вроде этого:

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
document.write(new_text);
Тимон. Z
источник
14

Код, который вам дают другие, заменяет только одно вхождение, тогда как использование регулярных выражений заменяет их все (как сказал @sorgit). Чтобы заменить все «хочу» на «не хочу», используйте этот код:

var text = "this is some sample text that i want to replace";
var new_text = text.replace(/want/g, "dont want");
document.write(new_text);

Переменная «new_text» приведет к тому, что «это образец текста, который я не хочу заменять».

Чтобы получить краткое руководство по регулярным выражениям, перейдите сюда:
http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
Чтобы узнать больше str.replace(), перейдите сюда:
https://developer.mozilla.org/ en-US / docs / JavaScript / Reference / Global_Objects / String / replace
Удачи!

Зойт
источник
14

эта функция заменяет только одно вхождение .. если вам нужно заменить несколько вхождений, попробуйте эту функцию: http://phpjs.org/functions/str_replace:527

Не обязательно. см. ответ Ганса Кестинга:

city_name = city_name.replace(/ /gi,'_');
Павел
источник
8

хм .. Вы проверяли replace ()?

Ваш код будет выглядеть так

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
document.write(new_text);
арбитр
источник
7
var new_text = text.replace("want", "dont want");
Городок
источник
7

В JavaScript вы вызываете replaceметод объекта String, например "this is some sample text that i want to replace".replace("want", "dont want"), который вернет замененную строку.

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want"); // new_text now stores the replaced string, leaving the original untouched

источник
7

В JavaScript есть replace()метод объекта String для замены подстрок. У этого метода может быть два аргумента. Первый аргумент может быть строкой или шаблоном регулярного выражения (объект regExp), а второй аргумент может быть строкой или функцией. Пример replace()метода, имеющего оба строковых аргумента, показан ниже.

var text = 'one, two, three, one, five, one';
var new_text = text.replace('one', 'ten');
console.log(new_text)  //ten, two, three, one, five, one

Обратите внимание, что если первым аргументом является строка, заменяется только первое вхождение подстроки, как в приведенном выше примере. Чтобы заменить все вхождения подстроки, вам необходимо предоставить регулярное выражение с g(глобальным) флагом. Если вы не предоставите глобальный флаг, будет заменено только первое вхождение подстроки, даже если вы укажете регулярное выражение в качестве первого аргумента. Итак, давайте заменим все вхождения oneв приведенном выше примере.

var text = 'one, two, three, one, five, one';
var new_text = text.replace(/one/g, 'ten');
console.log(new_text)  //ten, two, three, ten, five, ten

Обратите внимание, что вы не заключаете шаблон регулярного выражения в кавычки, которые сделают его строкой, а не объектом regExp. Чтобы выполнить замену без учета регистра, вам необходимо предоставить дополнительный флаг, iкоторый делает шаблон без учета регистра. В этом случае указанное выше регулярное выражение будет /one/gi. Обратите внимание на iдобавленный здесь флаг.

Если второй аргумент имеет функцию и есть совпадение, функция передается с тремя аргументами. Аргументы, которые получает функция, - это совпадение, позиция совпадения и исходный текст. Вам нужно вернуть то, чем нужно заменить это совпадение. Например,

var text = 'one, two, three, one, five, one';
var new_text = text.replace(/one/g, function(match, pos, text){
return 'ten';
});
console.log(new_text) //ten, two, three, ten, five, ten

Вы можете лучше контролировать заменяющий текст, используя функцию в качестве второго аргумента.

Сарал
источник
2
Вы единственный, кто упоминает функцию внутри возможности замены
Эмиус 07
4

Ты можешь использовать

text.replace('old', 'new')

И чтобы изменить сразу несколько значений в одной строке, например, чтобы изменить # на строку v и _ на строку w:

text.replace(/#|_/g,function(match) {return (match=="#")? v: w;});
Аабиро
источник
3

Если вам действительно нужен эквивалент PHP, str_replaceвы можете использовать Locutus . Версия PHP str_replaceподдерживает больше возможностей, чем то, что String.prototype.replaceподдерживает JavaScript . Например теги:

//PHP
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
//JS with Locutus
var $bodytag = str_replace(['{body}', 'black', '<body text='{body}'>')  

или массив

//PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
//JS with Locutus
var $vowels = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"];
var $onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

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

function str_replace (search, replace, subject) {

  var i = 0
  var j = 0
  var temp = ''
  var repl = ''
  var sl = 0
  var fl = 0
  var f = [].concat(search)
  var r = [].concat(replace)
  var s = subject
  s = [].concat(s)

  for (i = 0, sl = s.length; i < sl; i++) {
    if (s[i] === '') {
      continue
    }
    for (j = 0, fl = f.length; j < fl; j++) {
      temp = s[i] + ''
      repl = r[0]
      s[i] = (temp).split(f[j]).join(repl)
      if (typeof countObj !== 'undefined') {
        countObj.value += ((temp.split(f[j])).length - 1)
      }
    }
  }
  return s[0]
}
var text = "this is some sample text that i want to replace";

var new_text = str_replace ("want", "dont want", text)
document.write(new_text)

для получения дополнительной информации см. исходный код https://github.com/kvz/locutus/blob/master/src/php/strings/str_replace.js

Виктор Перес
источник
2

Уже есть несколько ответов с использованием str.replace () (что достаточно справедливо для этого вопроса), regexно вы можете использовать комбинацию str.split () и join () вместе, что быстрее, чем str.replace()и regex.

Ниже рабочий пример:

var text = "this is some sample text that i want to replace";

console.log(text.split("want").join("dont want"));

Викасдип Сингх
источник
2

У вас есть следующие возможности:

  1. Заменить первое вхождение

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace('want', 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i WANT to replace as well"
console.log(new_text)

  1. Заменить все вхождения - с учетом регистра

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace(/want/g, 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i WANT to replace as well
console.log(new_text)

  1. Заменить все вхождения - без учета регистра

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace(/want/gi, 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i dont want to replace as well
console.log(new_text)

Подробнее -> здесь

Святослав Петров
источник
2

В Javascript замените функцию, доступную для замены подстроки из заданной строки на новую. Использование:

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
console.log(new_text);

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

var text = "123,123,123";
var new_text = text.replace(/,/g, ".");
console.log(new_text);

Здесь gмодификатор используется для глобального сопоставления всех доступных совпадений.

Лавприт Сингх
источник
2

Способ replace substring in a sentenceиспользования React:

 const replace_in_javascript = (oldSubStr, newSubStr, sentence) => {
    let newStr = "";
    let i = 0;
    sentence.split(" ").forEach(obj => {
      if (obj.toUpperCase() === oldSubStr.toUpperCase()) {
        newStr = i === 0 ? newSubStr : newStr + " " + newSubStr;
        i = i + 1;
      } else {
        newStr = i === 0 ? obj : newStr + " " + obj;
        i = i + 1;
      }
    });
    return newStr;
  };

RunMethodHere

bh4r4th
источник
2

Если вы не хотите использовать регулярное выражение, вы можете использовать эту функцию, которая заменит все в строке

Исходный код:

function ReplaceAll(mystring, search_word, replace_with) 
{
    while (mystring.includes(search_word))
    {
        mystring = mystring.replace(search_word, replace_with);
    }

    return mystring;  
}

Как использовать:

var mystring = ReplaceAll("Test Test", "Test", "Hello"); 
al000y
источник
2

String.prototype.replaceПервый аргумент JS должен быть шаблоном Regex или String, а второй аргумент должен быть String или функцией.

str.replace(regexp|substr, newSubStr|function);

Пример:

var str = 'this is some sample text that i want to replace'; var newstr = str.replace(/want/i, "dont't want"); document.write(newstr); // this is some sample text that i don't want to replace

Оли
источник
0
function str_replace($old, $new, $text)
{
   return ($text+"").split($old).join($new); 
}

Вам не нужны дополнительные библиотеки.

18C
источник
0

В ECMAScript 2021 вы можете использовать replaceAllможно использовать.

const str = "string1 string1 string1"
const newStr = str.replaceAll("string1", "string2");

console.log(newStr)
//  "string2 string2 string2"
Сверхновая звезда
источник
-1

Добавлен метод, replace_in_javascriptкоторый удовлетворит ваши требования. Также обнаружено, что вы пишете строку, "new_text"в document.write()которой предполагается ссылка на переменную new_text.

let replace_in_javascript= (replaceble, replaceTo, text) => {
  return text.replace(replaceble, replaceTo)
}

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write(new_text);

Картик
источник