我有一个字符串(部分是 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:');

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

最佳答案

这应该这样做:-

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 元素都将被正则表达式中的第一个选项拾取,一旦被消耗就意味着任何包含的 :-) 都无法匹配,因为处理器将超出它。

关于javascript - 如何在 JavaScript 中替换不在特定标签内的文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1666790/

10-13 04:57