Bagaimana saya bisa melakukan str_replace dalam JavaScript, mengganti teks dalam JavaScript?

137

Saya ingin menggunakan str_replaceatau alternatif serupa untuk mengganti beberapa teks dalam 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");

harus memberi

this is some sample text that i dont want to replace

Jika Anda akan regex, apa implikasi kinerja dibandingkan dengan metode penggantian bawaan.

Vish
sumber
3
Aneh tidak ada yang memperhatikan bahwa PHP str_replacejuga menerima dua array dengan panjang yang sama, di mana setiap string dalam array pertama diganti dengan string dalam array kedua pada indeks yang sama. Silakan lihat stackoverflow.com/a/5069776/296430 untuk satu-satunya fungsi yang benar yang saya temukan sejauh ini yang meniru perilaku persis ini dalam javascript.
Jules Colle
2
@JulesColle jawaban yang sering gagal - lihat mengapa / kapan gagal dan solusi yang lebih baik di sini: stackoverflow.com/a/37949642/445295
Stephen M. Harris
1
Jika Anda ingin kompatibilitas tinggi - termasuk kebiasaan - dengan versi php ... lihat di github.com/kvz/locutus/blob/master/src/php/strings/…
Doug Coburn

Jawaban:

12

Menggunakan regex untuk penggantian string secara signifikan lebih lambat daripada menggunakan penggantian string.
Seperti yang ditunjukkan pada JSPerf , Anda dapat memiliki tingkat efisiensi yang berbeda untuk membuat regex, tetapi semuanya secara signifikan lebih lambat daripada penggantian string sederhana. Regex lebih lambat karena :

Pencocokan string tetap tidak memiliki pengulangan, langkah kompilasi, rentang, kelas karakter, atau sejumlah fitur lain yang memperlambat mesin ekspresi reguler. Tentu saja ada cara untuk mengoptimalkan pertandingan regex, tapi saya pikir itu tidak mungkin untuk mengalahkan pengindeksan menjadi string dalam kasus umum.

Untuk uji coba sederhana pada halaman JS perf, saya telah mendokumentasikan beberapa hasil:

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

Hasil untuk Chrome 68 adalah sebagai berikut:

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

Dari demi kelengkapan jawaban ini (meminjam dari komentar), perlu disebutkan bahwa .replacehanya menggantikan contoh pertama dari karakter yang cocok. Hanya mungkin untuk mengganti semua instance dengan //g. Pertukaran kinerja dan keanggunan kode bisa dikatakan lebih buruk jika mengganti beberapa instance name.replace(' ', '_').replace(' ', '_').replace(' ', '_');atau lebih burukwhile (name.includes(' ')) { name = name.replace(' ', '_') }

TheChetan
sumber
Itu menarik dan masuk akal bahwa penggantian string murni lebih cepat daripada regex. Mungkin perlu disebutkan (seperti dalam beberapa jawaban) yang .replacehanya menggantikan contoh pertama dari karakter yang cocok. Hanya mungkin untuk mengganti semua instance dengan //g. Pertukaran kinerja dapat dikatakan lebih buruk jika mengganti beberapa instance name.replace(' ', '_').replace(' ', '_').replace(' ', '_');atau lebih burukwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Lex
201

Anda akan menggunakan replacemetode ini:

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

Argumen pertama adalah apa yang Anda cari, tentu saja. Itu juga dapat menerima ekspresi reguler.

Ingatlah bahwa itu tidak mengubah string asli. Ini hanya mengembalikan nilai baru.

sdleihssirhc
sumber
4
Terima kasih banyak untuk 'ini hanya kembali dan tidak berubah'! Itulah yang saya sobek rambut saya untuk waktu yang lama sampai saya menemukan komentar Anda ...
Aditya MP
70
string.replace ('old', 'new') hanya akan menggantikan instance pertama dari 'old' dalam string. menggunakan ekspresi reguler dengan flag 'g' seperti pada jawaban realmag777 akan menggantikan semua instance string. text = text.replace (/ old / g, 'new') akan menggantikan semua instance dari 'old'
WNRosenberg
1
bagaimana kalau tidak case-sensitive?
Netorica
7
^ text.replace (/ old / gi, 'baru') akan menggantikan semua instance 'lama' untuk 'baru' yang tidak peka huruf besar-kecil (misalnya 'OLD' dan 'oLd' akan diganti juga)
arnoudhgz
2
dan beberapa dokumen dengan itu: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
elad silver
84

Lebih sederhana:

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

Ganti semua spasi dengan '_'!

realmag777
sumber
10
ini adalah terjemahan yang lebih akurat dari apa yang dilakukan "str_replace" (global). Jawaban yang dipilih hanya akan menggantikan contoh pertama.
KAYA
1
Jangan lupa untuk keluar dari karakter, terutama jika Anda mengganti hex yang lolos: \ x27 misalnya akan menjadi.replace(/\\x3B/g,';')
dmayo
18

Semua metode ini tidak mengubah nilai asli, mengembalikan string baru.

var city_name = 'Some text with spaces';

Mengganti ruang 1 dengan _

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

Mengganti semua spasi dengan _ menggunakan regex. Jika Anda perlu menggunakan regex, maka saya sarankan mengujinya dengan https://regex101.com/

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

Mengganti semua spasi dengan _ tanpa regex . Cara fungsional.

city_name.split(' ').join('_');  // Returns: Some_text_with_spaces
Lukas Liesis
sumber
16

Anda harus menulis sesuatu seperti itu:

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

Kode yang diberikan orang lain hanya menggantikan satu kemunculan, saat menggunakan ekspresi reguler menggantikan semuanya (seperti kata @sorgit). Untuk mengganti semua "ingin" dengan "tidak mau", beri kami kode ini:

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

Variabel "new_text" akan menghasilkan "ini adalah beberapa contoh teks yang tidak ingin saya ganti".

Untuk mendapatkan panduan singkat tentang ekspresi reguler, buka di sini:
http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
Untuk mempelajari lebih lanjut str.replace(), buka di sini:
https://developer.mozilla.org/ id-AS / docs / JavaScript / Referensi / Global_Objects / String / ganti
Good luck!

Zoyt
sumber
14

fungsi itu hanya menggantikan satu kejadian .. jika Anda perlu mengganti beberapa kejadian, Anda harus mencoba fungsi ini: http://phpjs.org/functions/str_replace=27

Belum tentu. lihat jawaban Hans Kesting:

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

hm .. Apakah Anda memeriksa ganti ()?

Kode Anda akan terlihat seperti ini

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

Dalam JavaScript, Anda memanggil replacemetode pada objek String, misalnya "this is some sample text that i want to replace".replace("want", "dont want"), yang akan mengembalikan string yang diganti.

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

sumber
7

JavaScript memiliki replace()metode objek String untuk mengganti substring. Metode ini dapat memiliki dua argumen. Argumen pertama dapat berupa string atau pola ekspresi reguler (objek regExp) dan argumen kedua dapat berupa string atau fungsi. Contoh replace()metode yang memiliki kedua argumen string ditunjukkan di bawah ini.

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

Perhatikan bahwa jika argumen pertama adalah string, hanya kemunculan pertama dari substring yang diganti seperti pada contoh di atas. Untuk mengganti semua kemunculan substring Anda perlu memberikan ekspresi reguler dengan gbendera (global). Jika Anda tidak memberikan flag global, hanya kemunculan substring pertama yang akan diganti bahkan jika Anda memberikan ekspresi reguler sebagai argumen pertama. Jadi mari kita ganti semua kejadian onedalam contoh di atas.

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

Perhatikan bahwa Anda tidak membungkus pola ekspresi reguler dalam tanda kutip yang akan membuatnya menjadi string bukan objek regExp. Untuk melakukan penggantian case-insensitive Anda perlu memberikan flag tambahan iyang membuat pola case-insensitive. Jika demikian, persamaan reguler di atas adalah /one/gi. Perhatikani bendera yang ditambahkan di sini.

Jika argumen kedua memiliki fungsi dan jika ada kecocokan fungsi dilewatkan dengan tiga argumen. Argumen fungsi yang didapat adalah kecocokan, posisi kecocokan dan teks asli. Anda harus mengembalikan pertandingan apa yang harus diganti. Sebagai contoh,

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

Anda dapat memiliki kontrol lebih besar atas teks pengganti menggunakan fungsi sebagai argumen kedua.

Saral
sumber
2
Anda adalah satu-satunya yang menyebutkan fungsi di dalam kemampuan ganti
Emeeus
4

Kamu bisa memakai

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

Dan untuk mengubah banyak nilai dalam satu string sekaligus, misalnya mengubah # ke string v dan _ ke string w:

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

Jika Anda benar-benar ingin yang setara dengan PHP, str_replaceAnda dapat menggunakan Locutus . Versi PHP str_replacemendukung lebih banyak opsi daripada yang String.prototype.replacedidukung JavaScript . Misalnya tag:

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

atau array

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

Juga ini tidak menggunakan regex melainkan digunakan untuk loop. Jika Anda tidak ingin menggunakan regex tetapi ingin penggantian string sederhana, Anda dapat menggunakan sesuatu seperti ini (berdasarkan 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)

untuk info lebih lanjut lihat kode sumber https://github.com/kvz/locutus/blob/master/src/php/strings/str_replace.js

Victor Perez
sumber
2

Sudah ada beberapa jawaban menggunakan str.replace () (yang cukup adil untuk pertanyaan ini) dan regextetapi Anda dapat menggunakan kombinasi str.split () dan join () bersama-sama yang lebih cepat daripada str.replace()dan regex.

Di bawah ini adalah contoh kerja:

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

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

Vikasdeep Singh
sumber
2

Anda memiliki opsi berikut:

  1. Ganti kejadian pertama

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. Ganti semua kejadian - sensitif huruf

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. Ganti semua kejadian - tidak sensitif huruf

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)

Info lebih lanjut -> di sini

Svetoslav Petrov
sumber
2

Dalam Javascript, ganti fungsi yang tersedia untuk mengganti sub-string dari string yang diberikan dengan yang baru. Menggunakan:

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

Anda bahkan dapat menggunakan ekspresi reguler dengan fungsi ini. Misalnya, jika ingin mengganti semua kemunculan ,dengan ..

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

Di sini gpengubah digunakan untuk mencocokkan secara global semua pertandingan yang tersedia.

Lovepreet Singh
sumber
2

Metode untuk replace substring in a sentencemenggunakan Bereaksi:

 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
sumber
2

Jika Anda tidak ingin menggunakan regex maka Anda dapat menggunakan fungsi ini yang akan mengganti semua dalam sebuah string

Kode sumber:

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

    return mystring;  
}

Cara Penggunaan:

var mystring = ReplaceAll("Test Test", "Test", "Hello"); 
hampir setiap tahun
sumber
2

Gunakan String.prototype.replaceargumen JS pertama harus pola Regex atau String dan argumen kedua harus menjadi String atau fungsi.

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

Ex:

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

oli
sumber
0
function str_replace($old, $new, $text)
{
   return ($text+"").split($old).join($new); 
}

Anda tidak perlu perpustakaan tambahan.

18C
sumber
-1

Menambahkan metode replace_in_javascriptyang akan memenuhi kebutuhan Anda. Juga menemukan bahwa Anda menulis string "new_text"di document.write()mana seharusnya merujuk ke variabel 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);

karthik
sumber