3

我有一个字符串(部分是 HTML),我想将字符串替换:-)为 bbcode :wink:。但是这种替换不应发生在 内<pre>,而应发生在任何其他标签中(甚至不在标签内)。

例如,我想替换

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

到:

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

我已经使用以下 RegEx 进行了尝试,但它不起作用(没有任何内容被替换):

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

有人可以帮帮我吗?:-)

4

4 回答 4

3

如果您使用合适的库(例如 jQuery),则可以完全避免地狱般的正则表达式,例如:

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:'));
});
于 2009-11-03T12:04:22.370 回答
3

这应该这样做: -

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

它之所以有效,是因为任何pre元素都将被正则表达式中的第一个选项拾取,并且一旦被使用意味着任何包含的 :-) 都无法匹配,因为处理器将超出它。

于 2009-11-03T12:21:07.720 回答
1

只是认为值得提供一个 DOM 解决方案:

例如

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!

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

}
于 2009-11-03T14:41:26.140 回答
0

尝试使用 var regex = /:-)(?!(^)*</pre>)/g;

于 2009-11-03T12:05:41.870 回答