Javascript: remplacez () toutes les balises html, sauf les étiquettes extérieures

J'ai une forme autocomplète et, lors de l'affichage des résultats correspondant à la chaîne de recherche de l'utilisateur, je veux souligner la chaîne de recherche elle-même. J'ai l'intention de le faire en enveloppant toute occurrence de la chaîne de recherche dans une balise telle que, ou une classe donnée. Maintenant, le problème est que, lors de l'utilisation de regEx, j'ai des problèmes si le modèle se produit dans une balise html. Par exemple

var searchPattern = 'pa'; var originalString = 'The pattern to <span class="something">be replaced is pa but only outside the html tag</span>'; var regEx = new RegExp(searchPattern, "gi") var output = originalString.replace(regEx, "<strong>" + searchPattern + "</strong>"); alert(output); 

(Demo: http://jsfiddle.net/cumufLm3/7/ )

Cela remplacera également l'occurrence de "pa" dans le tag

  <span class="something"> 

Briser le code. Je ne sais pas trop comment faire face à cela. J'ai vérifié diverses questions similaires, et j'ai compris qu'en général, je ne devrais pas utiliser des expressions régulières pour analyser html. Mais je ne sais pas s'il existe un moyen rapide d'analyser en douceur la chaîne html, de modifier le texte de chaque nœud et de "reconstruire" la chaîne avec le texte modifié?

Bien sûr, je suppose que je pourrais utiliser $ .parseHTML (), itérer sur chaque nœud, et en quelque sorte réécrire la chaîne, mais cela me semble trop complexe et susceptible d'erreurs. Existe-t-il une façon intelligente d'analyser la chaîne html de façon à dire "faire cela uniquement en dehors des balises html"?

Notez que le contenu de l'étiquette elle-même doit être traité. Donc, dans mon exemple ci-dessus, le remplacement () devrait également agir sur la partie "être remplacé par pa mais seulement en dehors de la balise html".

Une idée d'une expression régulière assez solide pour faire face à cela, ou (mieux, je suppose) pour gérer élégamment les parties de texte dans la chaîne html?

Votre code devrait ressembler à ceci:

 var searchWord = 'pa'; var originalString = 'The pattern to <span class="something">be replaced is pa but only outside the html tag</span>'; var regEx = new RegExp("(" + searchWord + ")(?!([^<]+)?>)", "gi"); var output = originalString.replace(regEx, "<strong>$1</strong>"); alert(output); 

Source: http://pureform.wordpress.com/2008/01/04/matching-a-word-characters-outside-of-html-tags/

Analysez le code HTML et trouvez tous les nœuds de texte, effectuez le remplacement dans tous. Si vous utilisez jQuery, vous pouvez le faire en passant simplement l'extrait à $() qui l'analyse dans un Document Fragment, que vous pouvez ensuite interroger ou passer en revue tous les éléments et trouver tous les .text() à remplacer.