Wie kann ich einen str_replace in JavaScript ausführen und Text in JavaScript ersetzen?

137

Ich möchte str_replaceoder eine ähnliche Alternative verwenden, um Text in JavaScript zu ersetzen.

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

sollte geben

this is some sample text that i dont want to replace

Wenn Sie Regex verwenden möchten, welche Auswirkungen hat dies auf die Leistung im Vergleich zu den integrierten Ersatzmethoden?

Vish
quelle
3
Seltsamerweise bemerkte niemand, dass PHPs str_replaceauch zwei Arrays gleicher Länge akzeptieren, wobei jeder String im ersten Array durch den String im zweiten Array am gleichen Index ersetzt wird. Die einzige korrekte Funktion, die ich bisher gefunden habe und die genau dieses Verhalten in Javascript nachahmt, finden Sie unter stackoverflow.com/a/5069776/296430 .
Jules Colle
2
@JulesColle diese Antwort schlägt oft fehl - sehen Sie, warum / wann sie fehlschlägt und eine bessere Lösung hier: stackoverflow.com/a/37949642/445295
Stephen M. Harris
1
Wenn Sie eine hohe Kompatibilität - einschließlich Macken - mit der PHP-Version wünschen ... schauen Sie unter github.com/kvz/locutus/blob/master/src/php/strings/…
Doug Coburn

Antworten:

12

Die Verwendung von Regex zum Ersetzen von Zeichenfolgen ist erheblich langsamer als die Verwendung von Zeichenfolgen.
Wie in JSPerf gezeigt , können Sie beim Erstellen eines regulären Ausdrucks unterschiedliche Effizienzstufen festlegen, die jedoch alle erheblich langsamer sind als das einfache Ersetzen von Zeichenfolgen. Die Regex ist langsamer, weil :

Übereinstimmungen mit festen Zeichenfolgen enthalten kein Backtracking, keine Kompilierungsschritte, Bereiche, Zeichenklassen oder eine Vielzahl anderer Funktionen, die die Engine für reguläre Ausdrücke verlangsamen. Es gibt sicherlich Möglichkeiten, Regex-Übereinstimmungen zu optimieren, aber ich denke, es ist im allgemeinen Fall unwahrscheinlich, dass die Indizierung in eine Zeichenfolge übertroffen wird.

Für einen einfachen Testlauf auf der JS perf-Seite habe ich einige der Ergebnisse dokumentiert:

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

Die Ergebnisse für Chrome 68 lauten wie folgt:

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

Der Vollständigkeit halber ist diese Antwort (aus den Kommentaren entlehnt) erwähnenswert, dass .replacenur die erste Instanz des übereinstimmenden Zeichens ersetzt wird. Es ist nur möglich, alle Instanzen durch zu ersetzen //g. Der Kompromiss zwischen Leistung und Code-Eleganz könnte als schlechter angesehen werden, wenn mehrere Instanzen ersetzt werden name.replace(' ', '_').replace(' ', '_').replace(' ', '_');oder schlechterwhile (name.includes(' ')) { name = name.replace(' ', '_') }

TheChetan
quelle
Das ist interessant und macht Sinn, dass das Ersetzen reiner Zeichenfolgen schneller ist als Regex. Es ist wahrscheinlich erwähnenswert (wie in einigen Antworten), dass .replacenur die erste Instanz des übereinstimmenden Zeichens ersetzt wird. Es ist nur möglich, alle Instanzen durch zu ersetzen //g. Der Performance-Kompromiss könnte als schlechter angesehen werden, wenn mehrere Instanzen ersetzt werden, name.replace(' ', '_').replace(' ', '_').replace(' ', '_');oder als schlechterwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Lex
201

Sie würden die replaceMethode verwenden:

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

Das erste Argument ist natürlich das, wonach Sie suchen. Es können auch reguläre Ausdrücke akzeptiert werden.

Denken Sie daran, dass die ursprüngliche Zeichenfolge dadurch nicht geändert wird. Es wird nur der neue Wert zurückgegeben.

sdleihssirhc
quelle
4
Vielen Dank für das "es kehrt nur zurück und ändert sich nicht"! Das war es, worüber ich mir lange die Haare riss, bis ich auf Ihren Kommentar stieß ...
Aditya MP
70
string.replace ('alt', 'neu') ersetzt nur die erste Instanz von 'alt' in der Zeichenfolge. Die Verwendung eines regulären Ausdrucks mit dem Flag 'g' wie in der Antwort von Realmag777 ersetzt alle Instanzen der Zeichenfolge. text = text.replace (/ old / g, 'new') ersetzt alle Instanzen von 'old'
WNRosenberg
1
Wie wäre es nicht zwischen Groß- und Kleinschreibung zu unterscheiden?
Netorica
7
^ text.replace (/ old / gi, 'new') ersetzt alle Instanzen von 'old' durch 'new', wobei die Groß- und Kleinschreibung nicht berücksichtigt wird (z. B. 'OLD' und 'oLd' werden ebenfalls ersetzt)
arnoudhgz
2
und einige Dokumente damit: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
elad silver
84

Einfacher:

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

Ersetzt alle Leerzeichen durch '_'!

Realmag777
quelle
10
Dies ist eine genauere Übersetzung dessen, was "str_replace" tut (global). Die gewählte Antwort ersetzt nur die erste Instanz.
Rich
1
Vergessen Sie nicht, Zeichen zu maskieren, insbesondere wenn Sie hexadezimal maskiert ersetzen: \ x27 wäre zum Beispiel.replace(/\\x3B/g,';')
dmayo
18

Alle diese Methoden ändern den ursprünglichen Wert nicht und geben neue Zeichenfolgen zurück.

var city_name = 'Some text with spaces';

Ersetzt das erste Leerzeichen durch _

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

Ersetzt alle Leerzeichen durch _ mit Regex. Wenn Sie Regex verwenden müssen, empfehle ich, es mit https://regex101.com/ zu testen.

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

Ersetzt alle Leerzeichen durch _ ohne regulären Ausdruck . Funktionsweise.

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

Sie sollten so etwas schreiben:

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.
quelle
14

Der Code, den andere Ihnen geben, ersetzt nur ein Vorkommen, während die Verwendung regulärer Ausdrücke sie alle ersetzt (wie @sorgit sagte). Um alle "wollen" durch "nicht wollen" zu ersetzen, geben Sie uns diesen Code:

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

Die Variable "new_text" führt zu "dies ist ein Beispieltext, den ich nicht ersetzen möchte".

Eine Kurzanleitung zu regulären Ausdrücken finden Sie hier:
http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
Weitere Informationen str.replace()finden Sie hier:
https://developer.mozilla.org/ de-US / docs / JavaScript / Reference / Global_Objects / String / replace
Viel Glück!

Zoyt
quelle
14

Diese Funktion ersetzt nur ein Vorkommen. Wenn Sie mehrere Vorkommen ersetzen müssen, sollten Sie diese Funktion ausprobieren: http://phpjs.org/functions/str_replace:527

Nicht unbedingt. siehe die Antwort von Hans Kesting:

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

hm .. Hast du replace () überprüft?

Ihr Code wird so aussehen

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
quelle
7
var new_text = text.replace("want", "dont want");
Stadt, Dorf
quelle
7

In JavaScript rufen Sie die replaceMethode für das String-Objekt auf, z. B. "this is some sample text that i want to replace".replace("want", "dont want")die ersetzte Zeichenfolge.

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

quelle
7

JavaScript verfügt replace()über eine String-Objektmethode zum Ersetzen von Teilzeichenfolgen. Diese Methode kann zwei Argumente haben. Das erste Argument kann eine Zeichenfolge oder ein Muster für reguläre Ausdrücke (regExp-Objekt) sein, und das zweite Argument kann eine Zeichenfolge oder eine Funktion sein. Ein Beispiel für eine replace()Methode mit beiden Zeichenfolgenargumenten ist unten dargestellt.

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

Beachten Sie, dass, wenn das erste Argument die Zeichenfolge ist, nur das erste Vorkommen der Teilzeichenfolge wie im obigen Beispiel ersetzt wird. Um alle Vorkommen der Teilzeichenfolge zu ersetzen, müssen Sie einen regulären Ausdruck mit einem g(globalen) Flag versehen. Wenn Sie das globale Flag nicht angeben, wird nur das erste Vorkommen der Teilzeichenfolge ersetzt, auch wenn Sie den regulären Ausdruck als erstes Argument angeben. Ersetzen wir also alle Vorkommen von oneim obigen Beispiel.

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

Beachten Sie, dass Sie das Muster für reguläre Ausdrücke nicht in Anführungszeichen setzen, wodurch es zu einer Zeichenfolge und nicht zu einem regExp-Objekt wird. Um eine Ersetzung ohne Berücksichtigung der Groß- und Kleinschreibung vorzunehmen, müssen Sie ein zusätzliches Flag iangeben, das das Muster ohne Berücksichtigung der Groß- und Kleinschreibung macht. In diesem Fall ist der obige reguläre Ausdruck /one/gi. Beachten Sie die ihier hinzugefügte Flagge.

Wenn das zweite Argument eine Funktion hat und eine Übereinstimmung vorliegt, wird die Funktion mit drei Argumenten übergeben. Die Argumente, die die Funktion erhält, sind die Übereinstimmung, die Position der Übereinstimmung und der Originaltext. Sie müssen zurückgeben, durch was diese Übereinstimmung ersetzt werden soll. Beispielsweise,

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

Sie können mehr Kontrolle über den Ersatztext haben, indem Sie eine Funktion als zweites Argument verwenden.

Saral
quelle
2
Sie sind der einzige, der die Funktion innerhalb der Ersetzungsfunktion erwähnt
Emeeus
4

Sie können verwenden

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

Und um mehrere Werte in einer Zeichenfolge gleichzeitig zu ändern, z. B. um # in Zeichenfolge v und _ in Zeichenfolge w zu ändern:

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

Wenn Sie wirklich ein Äquivalent zu PHPs wollen str_replace, können Sie Locutus verwenden . Die PHP-Version str_replaceunterstützt mehr Optionen als das, was JavaScript String.prototype.replaceunterstützt. Zum Beispiel Tags:

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

oder Arrays

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

Auch dies verwendet keinen regulären Ausdruck, sondern for-Schleifen. Wenn Sie keinen regulären Ausdruck verwenden möchten, aber einen einfachen String ersetzen möchten, können Sie so etwas verwenden (basierend auf 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)

Weitere Informationen finden Sie im Quellcode https://github.com/kvz/locutus/blob/master/src/php/strings/str_replace.js

Victor Perez
quelle
2

Es gibt bereits mehrere Antworten mit str.replace () (was für diese Frage fair genug ist), regexaber Sie können eine Kombination aus str.split () und join () verwenden, die schneller als str.replace()und istregex .

Unten ist ein Arbeitsbeispiel:

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

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

Vikasdeep Singh
quelle
2

Sie haben folgende Möglichkeiten:

  1. Ersetzen Sie das erste Vorkommen

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. Ersetzen Sie alle Vorkommnisse - Groß- und Kleinschreibung beachten

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. Ersetzen Sie alle Vorkommen - ohne Berücksichtigung der Groß- und Kleinschreibung

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)

Mehr Infos -> hier

Svetoslav Petrov
quelle
2

Ersetzen Sie in Javascript die verfügbare Funktion, um die Unterzeichenfolge der angegebenen Zeichenfolge durch eine neue zu ersetzen. Verwenden:

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

Mit dieser Funktion können Sie sogar reguläre Ausdrücke verwenden. Zum Beispiel, wenn Sie alle Vorkommen von ,durch ersetzen möchten ..

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

Hier wird der gModifikator verwendet, um alle verfügbaren Übereinstimmungen global abzugleichen.

Lovepreet Singh
quelle
2

Methode zur replace substring in a sentenceVerwendung von 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
quelle
2

Wenn Sie keinen regulären Ausdruck verwenden möchten, können Sie diese Funktion verwenden, die alle Zeichenfolgen ersetzt

Quellcode:

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

    return mystring;  
}

Wie benutzt man:

var mystring = ReplaceAll("Test Test", "Test", "Hello"); 
al000y
quelle
2

Das String.prototype.replaceerste JS- Argument sollte ein Regex-Muster oder ein String sein, und das zweite Argument sollte ein String oder eine Funktion sein.

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
quelle
0
function str_replace($old, $new, $text)
{
   return ($text+"").split($old).join($new); 
}

Sie benötigen keine zusätzlichen Bibliotheken.

18C
quelle
-1

Es wurde eine Methode hinzugefügt, replace_in_javascriptdie Ihren Anforderungen entspricht. Es wurde auch festgestellt, dass Sie eine Zeichenfolge schreiben, "new_text"in document.write()der auf eine Variable verwiesen werden soll 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
quelle