6
votes

Regex remplacer la chaîne mais pas dans la balise HTML

Je veux remplacer une chaîne dans la page HTML à l'aide de JavaScript mais l'ignore, s'il est dans une balise HTML, par exemple: xxx pré>

Je veux remplacer Google code> par Google b> code>, mais pas ici: p> xxx pré>

J'ai essayé avec celui-ci: p>

<a href="google.com">visit <b>google</b> search engine</a>
you can search on <b>google</b> tatatata...


0 commentaires

9 Réponses :


6
votes

Vous seriez mieux en utilisant un analyseur HTML pour cela, plutôt que surgèrent. Je ne suis pas sûr que cela puisse être fait à 100% de manière fiable.


0 commentaires

0
votes

Vous ne pouvez pas vraiment faire cela, votre "Google" est toujours dans une balise, soit remplacer tout ou aucun


0 commentaires

5
votes

Vous pouvez ou ne pas être capable de faire avec un regexp. Cela dépend de la manière dont vous pouvez définir avec précision les conditions. Dire que vous souhaitez que la chaîne remplacée sauf si elle est dans une balise HTML n'est pas assez étroite, car tout sur la page est probablement dans une balise HTML (corps si rien d'autre).

Cela fonctionnerait probablement mieux pour traverser l'arborescence DOM pour cela au lieu d'essayer d'utiliser une regexp sur le HTML.


1 commentaires

Je suis d'accord. Recherchez tous les nœuds de texte du DOM contenant la chaîne. Gardez une liste noire de tags que vous NE PAS voulez-vous remplacer la chaîne dans. Vérifiez si le nœud texte est à l'intérieur de l'une de ces balises. Sinon, votre remplacement ne le laissez pas comme ça.



1
votes

analyse HTML avec une expression régulière ne sera pas facile pour rien d'autre que des cas triviaux, puisque html n'est pas régulier .

Pour plus de détails, voir cette question Stackoverflow (et réponses).


0 commentaires

0
votes

Eh bien, puisque tout fait partie d'une étiquette, votre demande n'a aucun sens réel. Si ce n'est que la balise , vous pourriez simplement vérifier cette pièce. Principalement en veillant à ce que vous n'ayez pas de balise avant un nouveau


0 commentaires


1
votes

Solution de contournement strong>

Si vous ne pouvez pas utiliser un analyseur HTML ou si vous êtes assez confiant sur votre structure HTML, essayez ceci: p>

  1. Faites le "mauvais" changement li>
  2. Répétez la répétition Remplacer (] *) (] +>) à 1 $ à quelques reprises (autant que nécessaire) li> ol>

    C'est une solution de contournement simple, mais travaille pour moi. p>

    contre? Eh bien ... vous devez faire le remplacer deux fois pour le cas ... ...> car il ne supprime que la première balise indésirable de chaque balise de la page P>

    [EDIT:] solution forte> p>

    Pourquoi ne pas utiliser jQuery, mettre le code HTML dans la page et faire quelque chose comme ceci: p>

    $(containerOrSth).find('a').each(function(){
     if($(this).children().length==0){
     $(this).text($(this).text().replace('google','evil')); 
     }else{
     //here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help
     }
    });
    


2 commentaires

Un autre con est que ce n'est pas un analyseur.


Hé, j'ai dit "si tu ne peux pas utiliser un parser" - alors oui, ce n'est pas




1
votes

J'utilise regex = nouveau regexp ("(? = [^>] * <) Google", 'i');


1 commentaires

Ce lookahead travaille pour mon cas. Veuillez noter que le remplacement ne fonctionne que si une balise d'ouverture suit le mot-clé «Google» (qui doit toujours être le cas pour HTML valide). J'ai également ajouté le drapeau "G" afin que plusieurs occurrences de "Google" à l'intérieur de la même balise soient correctement remplacées.