我有一个字符串(部分是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:');
有人可以帮帮我吗? : - )
答案 0 :(得分: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:'));
});
答案 1 :(得分:2)
这应该这样做: -
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
元素,并且一旦消耗就意味着任何包含的:-)无法匹配,因为处理器将超出它。
答案 2 :(得分:1)
认为提供DOM解决方案是值得的:
E.g。
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 );
}
答案 3 :(得分:0)
尝试 var regex = /: - )(?!(^)*&lt; / pre&gt;)/ g;