2011-05-25 5 views
1

J'ai une fonction qui modifie le code HTML des éléments sélectionnés ..mot-clé RegExp échapper

$('p').fill('John'); // "John" 

..that remplace $value avec le HTML en cours ..

$('p').fill('Hi $value.') // "Hi John." 

..too souvent.

// Should be "The keyword is $value." 
$('p').fill('The keyword is \$value.'); // "The keyword is \Hi John.." 

J'utilise actuellement ce pour analyser la valeur ..

value.replace(/\$value/gi, item.innerHTML); 

..et la solution que je suis venu avec était ..

value.replace(/[^\\]\$value/gi, '$1' + item.innerHTML); 

..mais dans certains cas, ça ne marche pas.

// Ends up with "$value John." 
$('p').fill('Hi') // Yes, it supports stacking. 
    .fill('$value John.'); // Should be "Hi John." 

J'ai aussi essayé ..

value.replace(/[^\\]?\$value/gi, '$1' + item.innerHTML); 

..mais qui a de multiples problèmes.

  • Si le caractère non backslash ne correspond pas, alors $1 n'est pas remplacé, et je ne reste pas bloqué avec cela au hasard inséré.
  • Si c'est facultatif, il pourrait y avoir encore une barre oblique inverse là, et nous vous retrouver avec une barre oblique inverse au hasard et le $1.

Toute idée de comment résoudre ce problème?

Répondre

0

La barre oblique inverse est le caractère d'échappement dans une chaîne, donc l'utilisation on ne le faire apparaître dans la chaîne. Essayez d'en utiliser deux. Vous serez laissé avec un littéral \.

Vous pouvez obtenir en regex négatifs assertions arrières JavaScript en utilisant un Function comme argument de remplacement.

var result = str.replace(/(.)(\$value)/, function(all, precedingChar, matched) { 

    if (precedingChar == '\\') { 
     return matched; 
    } 

    return precedingChar + 'hi John'; 
}); 

jsFiddle.

Cette fonction fonctionnera exactement comme vous l'aviez, mais si vous précedez la correspondance avec un \\, la chaîne sera retournée telle quelle.

+0

Ma question est de savoir comment ignorer '$ value' s'il y a une barre oblique inverse avant. – Kayla

+0

@tyler S'il y a une barre oblique inverse précédente, voulez-vous qu'elle soit retournée? – alex

+0

Non. Je veux que '$ value' devienne quel que soit le HTML, et' \ $ value' pour qu'il devienne '$ value'. – Kayla