Domanda

Ho una stringa (in parte HTML) dove voglio sostituire la stringa in :-) bbcode :wink:. Ma questa sostituzione non dovrebbe accadere entro <pre>, ma in ogni altro tag (o addirittura non all'interno di un tag).

Per esempio, voglio sostituire

:-)<pre>:-)</pre><blockquote>:-)</blockquote>

a:

:wink:<pre>:-)</pre><blockquote>:wink:</blockquote>

Ho già provato con la seguente espressione regolare, ma non funziona (nulla viene sostituita):

var s = ':-)<pre>:-)</pre><blockquote>:-)</blockquote>';
var regex = /:\-\)(?!(^<pre>).*<\/pre>)/g;
var r = s.replace(regex, ':wink:');

Per favore qualcuno può aiutarmi? : -)

È stato utile?

Soluzione

Questo dovrebbe farlo: -

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);

Funziona perché ogni elemento pre otterrà prelevati dalla prima opzione nell'espressione regolare e una volta consumato significa che qualsiasi :-) contenuta non può essere abbinato in quanto il processore sarà spostato oltre.

Altri suggerimenti

Si potrebbe evitare di espressioni regolari infernali del tutto, se si utilizza una libreria adatto come jQuery, per esempio:.

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:'));
});

solo pensato che sarebbe la pena di offrire una soluzione DOM:

per es.

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!

Ed ecco la funzione 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 );

}

provare con var regex = /: -) (?! (^) * ) / g;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top