您必须先取出 html 标签,然后才能进行替换,这样您就不会在其中混合标签和其他 a。
那么你必须使替换全局,这将导致一个正则表达式。
它有点长,但这会起作用,我相信有人可以稍微简化一下解决方案。
var str = "asdf <a href='http://asdf.com'>asdfasdfasdf</a> <span class='asdf'>asdf</span>",
// strip all html tags
// $1 is used to hold reference to the spot
stripped = str.replace(/<[^<>]+>/g, '$1'),
// keep a reference to all stripped tags
split = str.match(/<[^<>]+>/g),
// highlight the a's with the html tags stripped
highlight = stripped.replace(/a/g, "<b>a</b>"),
// loop length
len = split.length;
// loop through every html tag reference '$1' and replace it back in
for(var x = 0; x<len; x++) {
highlight = highlight.replace("$1", split[x]);
}
JSFIDDLE
一个不太冗长的版本:
tags = str.match(/<[^<>]+>/g),
highlight = str.replace(/<[^<>]+>/g, '@@').
replace(/a/g, "<b>a</b>").
replace(/@@/g, function() { return tags.shift() });
http://jsfiddle.net/X9cZg/1/