2011-08-23 3 views
1

Je veux ce code:JavaScript Remplacer tout comportement étrange

function renderTemplate(temp,content){ 
    for (var i in temp){ 
     replace = new RegExp("["+i+"]",'g'); 
     content = content.replace(i,temp[i]); 
    } 
    return content; 
} 
var temp = {'status':'ok','id':150}; 
var content = "your status is [status], again! your status is [status], and your id is [id], yes[id]"; 

alert(renderTemplate(temp,content)); 

Pour moi genrate cette chaîne:

your status is ok, again! your status is ok, and your id is 150, yes 150

Au lieu de cela, je reçois:

your ok is [status], again! your status is [status], and your 150 is [id], yes[id]

Rechercher où le ok a été placé ... .

vous pouvez l'exécuter ici: http://jsfiddle.net/v9vzd/

Merci

+0

Depuis javascript a un support natif pour regex, vous pouvez faire/[ – Dykam

Répondre

2

Bien que la bonne réponse d'Adrian Lang devrait vous mettre en route, je dirais que vous ne prenez pas la meilleure approche. Compiler des expressions rationnelles à partir d'une variable peut être gênant quand il s'agit de s'échapper, et c'est généralement plus lent en termes de performances.

Si elle était moi, je profiterais de passer d'une fonction à replace():

function renderTemplate(temp, content) { 
    return content.replace(/\[([^[\]+)\]/g, function ($0, key) { 
     return temp[key]; 
    }); 
} 

démonstration de travail: http://jsfiddle.net/AKsHb/

Cela fonctionne parce que la capture sous-expression, ([^\]]+) est passé à la fonction de remplacement en tant que second argument — libellé key dans notre fonction ci-dessus — et cela correspond à quelque chose entre un littéral [ et ].

2

Essayez le code suivant:

function renderTemplate(temp,content){ 
    for (var i in temp){ 
     replace = new RegExp("\\["+i+"\\]",'g'); 
     content = content.replace(replace,temp[i]); 
    } 
    return content; 
} 
var temp = {'status':'ok','id':150}; 
var content = "your status is [status], again! your status is [status], and your id is [id], yes[id]"; 

alert(renderTemplate(temp,content)); 

Vous ne pas utiliser l'objet RegExp vous avez créé. De plus, les crochets créent une classe de caractères, donc oyu doit échapper à la parenthèse carrée (et dans l'appel du constructeur RegExp, vous devez échapper à la barre oblique inverse, il s'agit donc de deux barres obliques inverses).

+0

+1 pour être techniquement correct (le meilleur type de correct) :-) –

Questions connexes