JavaScript'teki metni değiştirerek JavaScript'te nasıl str_replace gerçekleştirebilirim?


137

str_replaceJavaScript'teki bazı metinleri değiştirmek için veya benzer bir alternatif kullanmak istiyorum .

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

vermelisin

this is some sample text that i dont want to replace

Normal ifade yapacaksanız, yerleşik değiştirme yöntemlerine kıyasla performans sonuçları nelerdir?


3
Garip kimse, PHP'nin str_replaceaynı uzunlukta iki diziyi kabul ettiğini fark etti , burada ilk dizideki her dize aynı dizindeki ikinci dizideki dize ile değiştirildi. Javascript bu tam davranış taklit şimdiye kadar buldum tek doğru işlevi için stackoverflow.com/a/5069776/296430 bakınız .
Jules Colle

2
@JulesColle sık sık başarısız oluyor - neden / ne zaman başarısız olduğunu ve burada daha iyi bir çözümü görün: stackoverflow.com/a/37949642/445295
Stephen M. Harris

1
Tuhaflıklar dahil - - Eğer yüksek uyumluluk istiyorsanız php sürümü ile ... bakmak github.com/kvz/locutus/blob/master/src/php/strings/...
Doug Coburn

Yanıtlar:


12

Dize değiştirme için regex kullanmak, dize değiştirme kullanmaktan önemli ölçüde daha yavaştır. JSPerf'de
gösterildiği gibi , normal ifade oluşturmak için farklı verimlilik düzeylerine sahip olabilirsiniz, ancak hepsi basit bir dize değişiminden önemli ölçüde daha yavaştır. Normal ifade daha yavaştır çünkü :

Sabit dize eşleşmelerinde geri izleme, derleme adımları, aralıklar, karakter sınıfları veya normal ifade motorunu yavaşlatan bir dizi başka özellik yoktur. Regex maçları optimize etmek için kesinlikle yollar vardır, ancak bence yaygın bir durumda dizine bir dizgi yenmek için olası değildir.

JS perf sayfasında basit bir test çalışması için, bazı sonuçları belgeledim:

<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 için sonuçlar aşağıdaki gibidir:

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

Bu cevabın eksiksiz olması uğruna (yorumlardan ödünç alınması), .replacesadece eşleşen karakterin ilk örneğinin yerini aldığını belirtmek gerekir . Sadece tüm örnekleri değiştirmek mümkündür //g. Performans değiş tokuşu ve kod zarafeti, birden çok örneği değiştirirse name.replace(' ', '_').replace(' ', '_').replace(' ', '_');veya daha kötüsü daha kötü olabilir.while (name.includes(' ')) { name = name.replace(' ', '_') }


Bu ilginç ve saf dize yerine regex daha hızlı mantıklı. .replaceEşleşen karakterin yalnızca ilk örneğinin yerini alan (bazı yanıtlarda olduğu gibi) muhtemelen bahsetmeye değer . Sadece tüm örnekleri değiştirmek mümkündür //g. Birden fazla örneği değiştirirseniz name.replace(' ', '_').replace(' ', '_').replace(' ', '_');veya daha da kötüsü performans performansının daha kötü olduğu söylenebilirwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Lex

201

replaceYöntemi kullanırsınız :

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

İlk argüman aradığınız şey. Ayrıca düzenli ifadeleri kabul edebilir.

Sadece olmadığını hatırlamak değil orijinal dize değiştirin. Yalnızca yeni değeri döndürür.


4
'Sadece döner ve değişmez' için çok teşekkürler! Yorumunuza rastlayana kadar saçlarımı uzun süre yırtıp bıraktığım şey buydu ...
Aditya MP

70
string.replace ('old', 'new'), dizedeki yalnızca ilk 'eski' örneğinin yerini alır. realmag777'nin cevabı gibi 'g' bayrağıyla normal bir ifade kullanmak dizenin tüm örneklerinin yerini alacaktır. text = text.replace (/ old / g, 'new') tüm 'eski' örneklerinin yerini alacaktır
WNRosenberg

1
büyük / küçük harfe duyarlı olmamaya ne dersiniz?
Netorica

7
^ text.replace (/ old / gi, 'new'), büyük / küçük harfe duyarlı olmayan 'new' için tüm 'eski' örneklerinin yerini alacaktır (örneğin, 'OLD' ve 'oLd' de değiştirilecektir)
arnoudhgz


84

Daha basit:

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

Tüm boşlukları '_' ile değiştirir!


10
bu "str_replace" nin (global) yaptığı şeyin daha doğru bir çevirisidir. Seçilen cevap yalnızca ilk örneğin yerini alacaktır.
rICh

1
Karakterlerden kaçmayı unutmayın, özellikle onaltılık kaçan .replace(/\\x3B/g,';')
altıcayı

18

Tüm bu yöntemler orijinal değeri değiştirmez, yeni dizeler döndürür.

var city_name = 'Some text with spaces';

1. boşluğu _ ile değiştirir

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

Regex kullanarak tüm boşlukları _ ile değiştirir . Regex kullanmanız gerekiyorsa, https://regex101.com/ ile test etmenizi öneririz.

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

Regex olmadan tüm boşlukları _ ile değiştirir . İşlevsel yol.

city_name.split(' ').join('_');  // Returns: Some_text_with_spaces

16

Böyle bir şey yazmalısınız:

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

Diğerlerinin size verdiği kod, yalnızca bir kez gerçekleşirken, normal ifadeler kullanıldığında bunların yerini alır (@sorgit'in dediği gibi). Tüm "istemek" yerine "istemez" ifadesini değiştirmek için şu kodu kullanın:

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" değişkeni "bu, değiştirmek istemediğim bazı örnek metinlerdir" olur.

Normal ifadeler hakkında hızlı bir kılavuz almak için buraya gidin:
http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
Daha fazla bilgi str.replace()için buraya gidin:
https://developer.mozilla.org/ tr-tr / docs / JavaScript / Reference / Global_Objects / String / replace
İyi şanslar!


14

Bu işlev yalnızca bir tekrarın yerini alır .. Birden fazla tekrarlamayı değiştirmeniz gerekirse bu işlevi denemelisiniz: http://phpjs.org/functions/str_replace:527

Şart değil. Hans Kesting'in cevabına bakınız:

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

8

hm .. replace () öğesini kontrol ettiniz mi?

Kodunuz şöyle görünecek

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'te, replaceörneğin "this is some sample text that i want to replace".replace("want", "dont want"), değiştirilen dizeyi döndürecek olan String nesnesindeki yöntemi çağırırsınız .

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()alt dizeleri değiştirmek için String nesnesi yöntemine sahiptir . Bu yöntemin iki argümanı olabilir. İlk bağımsız değişken bir dize veya normal ifade deseni (regExp nesnesi) ve ikinci bağımsız değişken bir dize veya işlev olabilir. Her replace()iki dize bağımsız değişkenine sahip bir yöntem örneği aşağıda gösterilmiştir.

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

İlk bağımsız değişken dize ise, yukarıdaki örnekte olduğu gibi alt dizenin yalnızca ilk tekrarının değiştirildiğini unutmayın. Alt dizenin tüm tekrarlamalarını değiştirmek için g(genel) bayrağıyla düzenli bir ifade sağlamanız gerekir . Genel bayrağı sağlamazsanız, ilk bağımsız değişken olarak normal ifadeyi sağlasanız bile, alt dizenin yalnızca ilk örneği değiştirilir. Şimdi oneyukarıdaki örnekteki tüm oluşumları değiştirelim .

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

Normal ifade desenini regExp nesnesi değil, bir dize haline getirecek tırnak işaretleri içine almazsınız. Büyük / küçük harf duyarsız bir değiştirme yapmak için i, deseni büyük / küçük harf duyarsız yapan ek bayrak sağlamanız gerekir . Bu durumda, yukarıdaki düzenli ifade olacaktır /one/gi. iBuraya eklenen bayrağa dikkat edin .

İkinci bağımsız değişkenin bir işlevi varsa ve bir eşleşme varsa işlev üç bağımsız değişkenle iletilir. İşlevin aldığı argümanlar eşleşme, eşleşmenin konumu ve orijinal metindir. Bu eşleşmenin değiştirilmesi gereken şeyi döndürmeniz gerekir. Örneğin,

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

İkinci argüman olarak bir işlev kullanarak yeni metin üzerinde daha fazla kontrole sahip olabilirsiniz.


2
İçindeki işlevi değiştir işlevinden bahseden tek kişi
sensin

4

Kullanabilirsiniz

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

Ve bir dizede birden çok değeri aynı anda değiştirmek için, örneğin # dizesini v dizesine ve _ dizeyi w dizesine değiştirmek için:

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

3

Gerçekten PHP'lere eşdeğer bir ürün istiyorsanız Locutus'ustr_replace kullanabilirsiniz . PHP'nin desteklediği sürüm , JavaScript'in desteklediğinden daha fazla seçenek . Örneğin etiketler:str_replaceString.prototype.replace

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

veya dizi

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

Ayrıca bu, döngüler için kullandığı normal ifade kullanmaz. Normal ifade kullanmak istemiyorsanız, ancak basit dize değiştirmek istiyorsanız, böyle bir şey kullanabilirsiniz (Locutus'a dayalı)

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)

Daha fazla bilgi için kaynak koduna bakın https://github.com/kvz/locutus/blob/master/src/php/strings/str_replace.js


2

Orada kullanarak birden cevaplar zaten str.replace () (bu soru için adil yeterince olduğunu) ve regexancak kombinasyonunu kullanabilirsiniz str.split () ve () katılmak daha hangi hızlı bir arada str.replace()ve regex.

Aşağıda çalışan örnek:

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

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


2

Aşağıdaki seçenekleriniz vardır:

  1. İlk olayı değiştir

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. Tüm oluşumları değiştir - büyük / küçük harfe duyarlı

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. Tüm oluşumları değiştir - büyük / küçük harfe duyarlı değil

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)

Daha fazla bilgi -> burada


2

JavaScript yılında yerini yenisi ile verilen dizesinden alt dize yerine kullanılabilir işlevi. kullanın:

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

Bu işlevle normal ifadeyi bile kullanabilirsiniz. Örneğin, ,ile tüm tekrarlarını değiştirmek istiyorsanız ..

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

Burada, gtüm mevcut eşleşmeleri eşleştirmek için kullanılan değiştirici.


2

replace substring in a sentenceReact kullanma yöntemi :

 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

Eğer regex kullanmak istemiyorsanız, o zaman bir dizede yer değiştirecek olan bu fonksiyonu kullanabilirsiniz.

Kaynak kodu:

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

    return mystring;  
}

Nasıl kullanılır:

var mystring = ReplaceAll("Test Test", "Test", "Hello"); 

2

JS kullan String.prototype.replaceilk bağımsız değişkeni Regex deseni veya String olmalı ve İkinci bağımsız değişkeni bir String veya işlevi olmalıdır.

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

Ör:

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

Ek kitaplığa ihtiyacınız yoktur.


-1

replace_in_javascriptİhtiyaçlarınızı karşılayacak bir yöntem eklendi . Ayrıca bir dize yazıyoruz bulundu "new_text"yılında document.write()bir değişkene atıfta gerekiyordu olan 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);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.