Comment remplacer le texte pas dans une balise spécifique en JavaScript
-
13-09-2019 - |
Question
J'ai une chaîne (en partie HTML) où je veux remplacer la chaîne :-)
en bbcode :wink:
. Mais ce remplacement ne devrait pas se produire dans <pre>
, mais dans une autre balise (ou même pas dans une balise).
Par exemple, je veux remplacer
:-)<pre>:-)</pre><blockquote>:-)</blockquote>
à:
:wink:<pre>:-)</pre><blockquote>:wink:</blockquote>
Je l'ai déjà essayé avec l'expression rationnelle suivante, mais il ne fonctionne pas (rien ne se remplace):
var s = ':-)<pre>:-)</pre><blockquote>:-)</blockquote>';
var regex = /:\-\)(?!(^<pre>).*<\/pre>)/g;
var r = s.replace(regex, ':wink:');
Quelqu'un peut-il s'il vous plaît me aider? : -)
La solution
Cela devrait le faire: -
var src = ":-)<pre>:-)</pre><blockquote>:-)</blockquote>"
var result = src.replace(/(<pre>(?:[^<](?!\/pre))*<\/pre>)|(\:\-\))/gi, fnCallback)
function fnCallback(s)
{
if (s == ":-)") return ":wink:"
return s;
}
alert(result);
Il fonctionne parce que tout élément de pre
ne sera pas repris par la première option dans la regex et une fois consommé signifie que tout :-) contenu ne peut être égalé puisque le processeur sera déplacé au-delà.
Autres conseils
Vous pouvez éviter regexes infernales tout à fait si vous utilisez une bibliothèque appropriée telle que jQuery, par exemple:.
var excludeThese = ['pre'];
// loop over all elements on page, replacing :-) with :wink: for anything
// that is *not* a tag name in the excludeThese array
$('* not:(' + excludeThese.join(',') + ')').each(function() {
$(this).html($(this).html().replace(/:\-\)/,':wink:'));
});
Je pensais juste que ce serait une valeur offrant une solution DOM:
par exemple.
var div = document.createElement('div');
div.innerHTML = ":-)<pre>:-)</pre><blockquote>:-)</blockquote>";
replace(div, /:-\)/g, ":wink:", function(){
// Custom filter function.
// Returns false for <pre> elements.
return this.nodeName.toLowerCase() !== 'pre';
});
div.innerHTML; // <== here's your new string!
Et voici la fonction replace
:
function replace(element, regex, replacement, filter) {
var cur = element.firstChild;
if (cur) do {
if ( !filter || filter.call(cur) ) {
if ( cur.nodeType == 1 ) {
replace( cur, regex, replacement );
} else {
cur.data = cur.data.replace( regex, replacement );
}
}
} while ( cur = cur.nextSibling );
}
essayez avec var = regex /: -) (?! (^) * ) / g;