Ersetzen von Text Innerhalb von Curley Klammern JavaScript
Ich versuche, JavaScript zu verwenden, um dynamisch Inhalte ersetzen, Inhalte innerhalb von geschweiften Klammern. Hier ein Beispiel von meinem code:
var myString = "This is {name}'s {adjective} {type} in JavaScript! Yes, a {type}!";
var replaceArray = ['name', 'adjective', 'type'];
var replaceWith = ['John', 'simple', 'string'];
for(var i = 0; i <= replaceArray.length - 1; i ++) {
myString.replace(/\{replaceArray[i]\}/gi, replaceWith[i]);
}
alert(myString);
Den oben genannten code soll die Ausgabe "Dies ist John' s einfacher string in JavaScript! Ja, ein string!".
Hier ist was passiert:
- erhalten wir einen string mit Werten in geschweiften Klammern, die müssen ersetzt
- eine Schleife verwendet "replaceArray", um alle Werte in geschweiften Klammern, die müssen ersetzt
- diese Werte, zusammen mit den geschweiften Klammern ersetzt werden, die entsprechenden Werte in der "replaceWith" array
Allerdings bin ich nicht mit viel Glück, vor allem, da einen Wert ersetzt werden kann, an mehreren Standorten, und dass ich sich ein dynamischer Wert, der innerhalb des regulären Ausdrucks.
Kann mir jemand helfen dieses Problem zu lösen, mit einem ähnlichen setup wie oben?
- Ich bin angemeldet als ein anderer Benutzer in dieser Zeit... @William: habe ich nicht, lassen Sie mich versuchen das! @rsp: ich versuche mit reinem JavaScript auf diese ein, denn es gibt viele andere jQuery um diesen code-block, und ich hoffe, Leistung zu beschleunigen, indem Sie nur JavaScript.
- Dank William und Yi Jiang!!! Das funktionierte!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst
String.replace
ist nicht destruktiv - es ändert nicht den string selbst, so müssen SiemyString = myString.replace(...)
. Zweitens können Sie erstellenRegExp
Objekte, die dynamisch mitnew RegExp
, so das Ergebnis von allem das wäre:myString = myString.split('{' + replaceArray[i] + '}').join(replaceWith[i]);
(für die Lesbarkeit und die Leistung Gründen).myString.replace('/[{].*[}]/', text)
?/[{].*[}]/
. Der performance-Unterschied zwischen den beiden sein sollte, die klein genug für fast alle Zwecke, es ist vernachlässigbar, aber es sei denn, Sie erstellen müssen RegExp dynamisch (wie in dem Fall, in der Antwort), das den RegExp direkt sehr viel besser lesbar, da die Schaffung eines RegExp-Objekt erfordert eine Zeichenfolge übergeben werden, die Sie brauchen, um doppelte escape-alle backslashes. Wenn Sie Zweifel haben, benchmark-die beiden code und finden Sie selbst heraus, welche schneller istvar myString = 'foo/{bar}'; var myNewString = myString.replace(/[{].*[}]/, 'hi'); //"foo/hi"
Strings sind unveränderlich
Strings in JavaScript sind unveränderlich. Es bedeutet, dass, das wird nie so funktionieren wie Sie es erwarten:
Dies ist nicht nur ein problem mit
.replace()
- nichts mutieren kann ein string in JavaScript. Was können Sie stattdessen tun ist:Regex-Literale nicht die Werte interpoliert
Regulären Ausdruck Literale in JavaScript nicht die Werte interpoliert, so wird dies immer noch nicht funktionieren:
Müssen Sie etwas tun, wie dieses, statt:
Aber das ist ein bisschen chaotisch, so können Sie erstellen eine Liste von regexes erste:
Wie Sie sehen können, können Sie auch
i < replaceArray.length
statti <= replaceArray.length - 1
zur Vereinfachung der Schleifenbedingung.Update 2017
Nun können Sie machen es noch einfacher:
Ohne loop
Statt looping und anwenden
.replace()
Funktion immer und immer wieder, du kannst es nur einmal so:Sehen DEMO.
Templating engines
Sind Sie im Grunde erstellen Sie Ihre eigene Template-engine. Wenn Sie möchten, verwenden Sie eine fertige Lösung statt, dann überlegen:
oder sowas.
Ein Beispiel von, was Sie versuchen zu tun, mit Schnurrbart wäre:
Sehen DEMO.
plop
Mikro-generator, ist eine sehr nützliche Template-Bibliothek. Siehe @ plopjs.comHier ist eine Funktion, die den string und ein array von Ersetzungen. Es ist flexibel genug, um wieder verwendet werden. Der einzige Haken ist, müssen Sie die Verwendung von zahlen in Strings anstelle des strings. z.B.,
Demo: http://jsfiddle.net/4cfy7qvn/
{\d+}
so können Sie beliebige Länge arrays. Das Ergebnis wird wie folgt Aussehen:const replace = (string, replacementArray) => string.replace(/{(\d+)}/g, (match, captureGroup) => replacementArray[captureGroup]);
Der beste Weg, die ich gefunden habe, um dies zu tun, ist die Verwendung eines in-line-ersetzen-Funktion wie andere erwähnt haben, und von dem ich Sie geliehen. Special shout out an @yannic-hamann für die regex und ein gutes Beispiel. Ich bin nicht besorgt über die Leistung, wie ich bin nur tun dies, um zu konstruieren Pfade.
Fand ich meine Lösung in MDN ist docs.
JS:
Ich mag rsp Antwort. Vor allem die " Ohne loop' Abschnitt. Dennoch finde ich den code nicht so intuitiv. Ich verstehe, dass diese Frage kommt aus den beiden arrays Szenario und das ist mehr als 7 Jahre alt, aber da diese Frage erscheint als #1 auf google bei der Suche ersetzen Sie eine Zeichenkette mit geschweiften Klammern und der Autor gebeten, für einem ähnlichen setup bin ich versucht, eine andere Lösung.
Dass gesagt wird, eine Kopie und paste-Lösung zu spielen, um mit:
Diese Ressource mir wirklich geholfen, zu bauen und zu verstehen, den oben stehenden code und erfahren Sie mehr über regex mit JavaScript im Allgemeinen.