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: Je veux remplacer J'ai essayé avec celui-ci: p> Google code> par Google b> code>, mais pas ici: p> <a href="google.com">visit <b>google</b> search engine</a>
you can search on <b>google</b> tatatata...
9 Réponses :
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. P>
Vous ne pouvez pas vraiment faire cela, votre "Google" est toujours dans une balise, soit remplacer tout ou aucun p>
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). P>
Cela fonctionnerait probablement mieux pour traverser l'arborescence DOM pour cela au lieu d'essayer d'utiliser une regexp sur le HTML. P>
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 B> 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.
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 em>. p>
Pour plus de détails, voir cette question Stackoverflow (et réponses). P>
Eh bien, puisque tout fait partie d'une étiquette, votre demande n'a aucun sens réel. Si ce n'est que la balise code>, vous pourriez simplement vérifier cette pièce. Principalement en veillant à ce que vous n'ayez pas de balise code> avant un nouveau code> p>
Je pense que vous manquez tous la question ici ... p>
Quand il dit à l'intérieur de la balise, il signifie à l'intérieur de l'étiquette d'ouverture, comme dans la balise étiquette ... C'est quelque chose de très différent du texte, disons, à l'intérieur d'un < / p> paire de tag ou
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> 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
}
});
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
Vous pouvez le faire à l'aide de Regex, mais filtrant des blocs tels que le style, le script et les CDATA auront besoin de plus de travail, et non implémentées dans la solution suivante. P>
La plupart des réponses indiquent que "tes données est toujours dans certaines balises", mais il manque le point, les données sont toujours "entre" quelques balises et que vous souhaitez filtrer là où il est "dans" une balise. < / p>
Notez que les caractères d'étiquette des scripts en ligne briseront probablement cela, donc s'ils existent, ils doivent être traités séparément avec cette méthode. Jetez un coup d'œil ici:
Fonction HTML complexe.replace P>
J'utilise
regex = nouveau regexp ("(? = [^>] * <) Google", 'i'); code> p> p>
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.