2013-05-09 2 views
3

J'ai une chaîne avec plusieurs éléments avec ids comme ci-dessous:Javascript - Regex: Comment remplacer id dans la chaîne avec le même ID plus le numéro?

var data = "<div id='1'></div><input type='text' id='2'/>"; 

Maintenant, j'utilise ce regex pour trouver tous les id dans la chaîne:

var reg = /id="([^"]+)"/g; 

Ensuite je veux remplacer tous ces id avec un nouvel identifiant. Quelque chose comme ceci:

data = data.replace(reg, + 'id="' + reg2 + '_' + numCompare + '"'); 

Je veux reg2, comme on le voit ci-dessus, pour renvoyer la valeur des années id. Je ne connais pas trop les expressions régulières, alors comment puis-je faire cela?

+0

Avez-vous une source jquery? Pourrait rendre ce super facile et sans essayer d'utiliser regex sur dom, que vous devriez éviter. – smerny

+0

Oui, j'utilise actuellement jquery –

+0

Veuillez noter que les ID commençant par un nombre ne sont pas valides HTML – Dancrumb

Répondre

4

Au lieu d'utiliser regex, analyser et parcourir les éléments. Essayez:

var data = "<div id='1'></div><div id='asdf'><input type='text' id='2'/></div>", 
    numCompare = 23, 
    div = document.createElement("div"), 
    i, cur; 

div.innerHTML = data; 

function updateId(parent) { 
    var children = parent.children; 
    for (i = 0; i < children.length; i++) { 
     cur = children[i]; 
     if (cur.nodeType === 1 && cur.id) { 
      cur.id = cur.id + "_" + numCompare; 
     } 
     updateId(cur); 
    } 
} 

updateId(div); 

DEMO:http://jsfiddle.net/RbuaG/3/

Ce vérifie si le id est défini en premier lieu, et alors seulement il le modifier.

En outre, il est sûr au cas où le code HTML contient un noeud de commentaire (où IE 6-8 inclut des noeuds de commentaire dans .children).

En outre, il traverse tous les enfants de tous les éléments. Dans votre exemple, vous n'aviez qu'un niveau d'éléments (non imbriqué). Mais dans mon violon, je niche le <input /> et il est encore modifié.

Pour obtenir le code HTML mis à jour, utilisez div.innerHTML.

Avec jQuery, vous pouvez essayer:

var data = "<div id='1'></div><div id='asdf'><input type='text' id='2'/></div>", 
    numCompare = 23, 
    div = $("<div>"), 
    i, cur; 

div.append(data); 

div.find("[id]").each(function() { 
    $(this).attr("id", function (index, attr) { 
     return attr + "_" + numCompare; 
    }); 
}); 

DEMO:http://jsfiddle.net/tXFwh/5/

Bien qu'il soit valable de faire id commencer et/ou un numéro, vous devez modifier le id du éléments pour être un identifiant normal.

Références:

+1

Merci pour toutes les informations. Ça a marché comme sur des roulettes. :-) –

0

Essayez d'utiliser

.replace(/id='(.*?)'/g, 'id="$1_' + numCompare + '"'); 
0

En utilisant jQuery (suite à votre commments).

var data = "<div id='1'></div><input type='text' id='2'/>"; 
var output = $("<div></div>").html(data); // Convert string to jQuery object 
output.find("[id]").each(function() { // Select all elements with an ID 
    var target = $(this); 
    var id = target.attr("id"); // Get the ID 
    target.attr("id", id + "_" + numCompare); // Set the id 
}); 
console.log(output.html()); 

Cela est beaucoup mieux que d'utiliser regex sur HTML (Using regular expressions to parse HTML: why not?), est plus rapide (bien que peut être encore améliorée en ayant un sélecteur plus direct que $("[id]") tels que donner les éléments d'une classe).

Fiddle: http://jsfiddle.net/georeith/E6Hn7/10/

+1

Pas vraiment d'aide car il a dit: "J'ai une chaîne avec plusieurs éléments avec des id comme ci-dessous:" – slinky2000

+0

@StefanRay Peut convertir cette chaîne en un objet jQuery ... effectuer une manipulation ... convertir en arrière. jQuery travaille en mémoire pour. –

+1

@StefanRay Mise à jour avec travailler dans la version de la mémoire –

0

Regex est probablement pas la bonne façon de le faire, voici un exemple qui utilise jQuery:

var htmlstring = "<div id='1'></div><input type='text' id='2'/>"; 

var $dom = $('<div>').html(htmlstring); 

$('[id]', $dom).each(function() { 
    $(this).attr('id', $(this).attr('id') + '_' + numCompare); 
}); 

htmlstring = $dom.html(); 

Exemple: http://jsfiddle.net/fYb3U/

Questions connexes