2010-02-01 5 views
0

Il est beaucoup plus facile de montrer le code Javascript que d'offrir une explication complexe:Manipuler Javascript RegExp résultats comme non-cordes

var html = '<input tabindex="1" type="text">';
html.replace(/tabindex="([0-9]+)"/g, 'tabindex="' + ("$1" * i) + '"');

Dans ce code, « $ 1 » sera toujours une chaîne, ce qui signifie ce RegExp se traduira toujours par 'tabindex = "NaN"' ... Utiliser parseInt ne fonctionne pas.

Est-il possible de transformer la réponse de RegExp en entier afin que je puisse effectuer des calculs sur le remplacement?

+0

Juste par curiosité, qu'essayez-vous de faire avec ce code? – jessegavin

+0

J'ai un bloc de HTML cloné dans le DOM, et je veux m'assurer que les attributs sont correctement mis à jour une fois clonés. Des choses simples, et ce qui précède est une simplification supplémentaire, comme un meilleur exemple. – beseku

+0

Comme dit outis, alors, vous devriez certainement considérer 'cloneNode' et pas de piratage de chaîne HTML. Ensuite, vous pouvez utiliser des affectations simples comme 'newelement.tabindex = oldelement.tabindex * i', et vous n'avez pas à vous soucier des formats HTML exacts (par exemple' innerHTML' d'IE vous renvoyant 'tabindex = 2' sans guillemets). Le seul gotcha est que dans IE (oh, IE, encore une fois, comment nous vous aimons), l'attribution de l'attribut 'name' a quelques rides. – bobince

Répondre

4

L'argument de remplacement can be a function:

html.replace(/tabindex="([0-9]+)"/g, function (all, tabindex) { 
     return 'tabindex="' + (tabindex * i) + '"' 
    }); 

Cependant, vous ne devriez utiliser les expressions régulières pour manipuler HTML si vous ne disposez pas d'un analyseur. Si ce code doit s'exécuter dans un navigateur, alors vous avez un analyseur. Si le nœud provient d'un autre document, utilisez document.importNode. Si le noeud se trouve dans le même document, utilisez Node.cloneNode. Les deux prennent en charge la copie en profondeur. CMS et outis vous ont donné votre réponse.

+0

Vous êtes un érudit et un gentil monsieur. Merci beaucoup. – beseku

Questions connexes