まず、フィルター処理された HTML をトークン化して単語を見つけ、次に置換を行います。
あなたの文字列から始めましょう:
var html = '<span style="font-family:Times New Roman;">At times like this don\'t know what to do. Other times I have no problem.</span>';
ケース 1、すべてのオカレンスを置き換えたい:
var tokens = html.replace(/<[^>]*>/g,'').split(/\W+/).filter(Boolean);
var newHTML = html.replace(new RegExp('\\b'+tokens[1]+'\\b', 'g'), function(s){
return '<span style="color:red;">'+s+'</span>'
});
デモンストレーション
ケース 2、指定されたインデックスの単語を置き換えたいだけです (これは驚くほどトリッキーです)。
var tokens = html.replace(/<[^>]*>/g,'').split(/\W+/).filter(Boolean);
var wordToReplaceIndex = 1, wordToReplace = tokens[wordToReplaceIndex];
var occIndex = 0;
for (var i=0; i<wordToReplaceIndex; i++) {
if (tokens[i]===wordToReplace) occIndex++;
}
i=0;
var newHTML = html.replace(new RegExp('\\b'+wordToReplace+'\\b', 'g'), function(s){
return (i++===occIndex) ? '<span style="color:red;">'+s+'</span>' : s
});
デモンストレーション
ケース 2 の代替ソリューション:
var i=0, wordToReplaceIndex = 1;
var newHTML = html.replace(/>([^<]+)</, function(txt) {
return txt.replace(/\w+/g, function(s) {
return i++==wordToReplaceIndex ? '<span style="color:red;">'+s+'</span>' : s;
})
});
2 番目がトリッキーだった理由がわかりますか? ;)