Compte tenu de cette fonction:
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(pattern, value);
}
};
return repeater;
};
Comment faire this.markup.replace()
remplacer globalement? Voici le problème. Si je l'utilise comme ça:
alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);
La valeur de l'alerte est "foobar $ TEST_ONE".
Si je change Repeater
comme suit, rien n'est remplacé dans Chrome:
function Repeater(template) {
var repeater = {
markup: template,
replace: function(pattern, value) {
this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
}
};
return repeater;
};
... et l'alerte est $TEST_ONE $TEST_ONE
.
la source
/pattern/
ounew RegExp("pattern")
.En termes d'interprétation des modèles, il n'y a aucune différence entre les formes suivantes:
/pattern/
new RegExp("pattern")
Si vous souhaitez remplacer une chaîne littérale en utilisant la
replace
méthode, je pense que vous pouvez simplement passer une chaîne au lieu d'une expression rationnelle àreplace
.Sinon, vous devrez d'abord échapper tous les caractères spéciaux de l'expression rationnelle dans le modèle - peut-être comme ceci:
la source
Votre modèle regex doit avoir le modificateur g:
remarquez le g à la fin. il indique au remplaçant d'effectuer un remplacement global.
De plus, vous n'avez pas besoin d'utiliser l'objet RegExp, vous pouvez construire votre modèle comme ci-dessus. Exemple de modèle:
un motif est toujours entouré par / de chaque côté - avec des modificateurs après le / final, le modificateur g étant le global.
EDIT: Pourquoi est-ce important si le motif est une variable? Dans votre cas, cela fonctionnerait comme ceci (notez que le modèle est toujours une variable):
Mais vous devrez changer votre fonction de remplacement en ceci:
la source