Як я можу виконати 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.
Jules Colle

2
@JulesColle, що відповідь часто не вдається - дізнайтеся, чому / коли вона не вдається, і краще рішення тут: stackoverflow.com/a/37949642/445295
Стівен М. Харріс,

1
Якщо ви хочете високої сумісності - включаючи химерність - з версією php ... подивіться на github.com/kvz/locutus/blob/master/src/php/strings/…
Doug Coburn

Відповіді:


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(' ', '_') }


Це цікаво, і є сенс, що заміна чистої струни відбувається швидше, ніж регулярний вираз. Напевно, варто згадати (як у деяких відповідях), що .replaceзамінює лише перший екземпляр відповідного символу. Єдине можливо замінити всіма екземплярами //g. Торгівля ефективністю можна стверджувати, що вона буде гіршою, якщо замінити кілька примірників name.replace(' ', '_').replace(' ', '_').replace(' ', '_');або гіршеwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Lex

201

Ви б використали replaceметод:

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

Перший аргумент - це те, що ви шукаєте, очевидно. Він також може приймати регулярні вирази.

Просто пам’ятайте, що це не змінює початковий рядок. Це лише повертає нове значення.


4
Велике спасибі за те, що "воно лише повертається і не змінюється"! Це те, що я довго розривав волосся, поки не натрапив на ваш коментар ...
Депутат Aditya

70
string.replace ('old', 'new') замінить лише перший екземпляр 'old' у рядку. використання регулярного виразу з прапором 'g', як у відповіді realmag777, замінить усі екземпляри рядка. text = text.replace (/ old / g, 'new') замінить усі екземпляри "old"
WNRosenberg

1
як щодо нечутливих до регістру?
Netorica

7
^ text.replace (/ old / gi, 'new') замінить усі екземпляри "old" на "new", не залежно від регістру (наприклад, "OLD" та "oLd" також будуть замінені)
arnoudhgz


84

Простіше:

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

Замінює всі пробіли на "_"!


10
це більш точний переклад того, що робить "str_replace" (глобальний). Обрана відповідь замінить лише перший екземпляр.
rICh

1
Не забудьте уникнути символів, особливо якщо ви замінюєте шестигранну втечу: \ x27, наприклад, буде.replace(/\\x3B/g,';')
dmayo

18

Усі ці методи не змінюють початкове значення, повертають нові рядки.

var city_name = 'Some text with spaces';

Замінює перший пробіл на _

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

Замінює всі пробіли _ за допомогою regex. Якщо вам потрібно використовувати регекс, то рекомендую протестувати його за допомогою 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);

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 / Довідка / Global_Objects / String / замінити
удачу!


14

ця функція замінює лише одне виникнення .. якщо вам потрібно замінити кілька входів, ви повинні спробувати цю функцію: http://phpjs.org/functions/str_replacewhat27

Не обов'язково. дивіться відповідь Ханса Кестінга:

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

8

хм .. Ви перевірили на заміну ()?

Ваш код буде виглядати приблизно так

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

У 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
Ви єдиний, хто згадує про функцію заміщення можливостей заміни
Емей

4

Можна використовувати

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

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

text.replace(/#|_/g,function(match) {return (match=="#")? v: w;});

3

Якщо ви дійсно хочете еквівалент PHP, str_replaceви можете використовувати Locutus . Версія str_replaceпідтримки PHP підтримує більше варіантів, ніж те, що 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


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

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

Вам не потрібні додаткові бібліотеки.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.