Javascript 如何替换非html标记的特定子字符串

Javascript 如何替换非html标记的特定子字符串,javascript,regex,Javascript,Regex,我想在下面的内容中将“红色”和“td”替换为“蓝色”,但我不希望最后一个和所有标记的颜色属性被弄乱 <tr> <td>Code name td A001</td> <td>Madam Red</td> <td><font color="red">do your job</font></td> </tr> 代号td A001 瑞德夫人 做好你的工作

我想在下面的内容中将“红色”和“td”替换为“蓝色”,但我不希望最后一个
和所有
标记的颜色属性被弄乱

<tr>
    <td>Code name td A001</td>
    <td>Madam Red</td>
    <td><font color="red">do your job</font></td>
</tr>

代号td A001
瑞德夫人
做好你的工作
这就是我想要的:

<tr>
    <td>Code name blue A001</td>
    <td>Madam blue</td>
    <td><font color="red">do your job</font></td>
</tr>

代号蓝色A001
蓝夫人
做好你的工作
但我在使用
/.*(红色| td.*/gi
替换内容时得到了这个结果

<tr>
    <blue>Code name blue A001</blue>
    <blue>Madam blue</blue>
    <blue><font color="blue">do your job</font></blue>
</tr>

代号蓝色A001
蓝夫人
做好你的工作
有没有正则表达式可以解决这个问题


谢谢。

这是一个黑客程序,但它可以工作。它需要几次迭代的替换

步骤1:在有标记或目标词(td或红色)的任何位置为文本添加标记。仅将标签放回替换件中;目标词被省略,仅由标记本身代替

搜索:
(]+>)|(\btd\b |\breed\b)

替换:
$1@MARKER@

临时结果:

<tr>@MARKER@
  <td>@MARKER@Code name @MARKER@ A001</td>@MARKER@
  <td>@MARKER@Madam @MARKER@</td>@MARKER@
  <td>@MARKER@<font color="red">@MARKER@do your job</font>@MARKER@</td>@MARKER@
</tr>@MARKER@
<tr>
  <td>Code name @MARKER@ A001</td>
  <td>Madam @MARKER@</td>
  <td><font color="red">do your job</font></td>
</tr>
步骤3:用“蓝色”替换(从结果字符串中)任何剩余的标记

搜索:
@MARKER@


替换:
blue

这里有一个技巧,只需一次即可替换:

((?!<\/td)[^<]|^)(?:td|red)(?![^<]*>)

示例代码:

var re = /((?!<\/td)[^<]|^)(?:td|red)(?![^<]*>)/ig; 
var str = '<tr>\n    <td>Code /td name td A001</td>\n    <td>Madam Red</td>\n    <td><font color="red">do your job</font></td>\n</tr>';
var subst = '$1blue'; 
var result = str.replace(re, subst);
var re=/(?!请注意Scott Kaye posted.Regex不是解析或操作HTML的好工具

我创建了一个,演示了一种非常不同的方法。我的方法涉及到一个非常小的DOM walker。您为它提供一个节点,它从该节点开始遍历DOM,并使用它访问的各种节点返回到您的函数。DOM walker实现只是被放在一起,我确信它非常需要改进是的,但它适用于这种情况。您可以这样称呼它:

var dw = new DomWalker();
dw.on('text', function(node) {
    node.nodeValue = node.nodeValue.replace(/red|td/ig, 'blue');
});
dw.walk(document.getElementById('myRow'));
注意,尽管我仍然在这里使用正则表达式,但我只在纯文本字符串上使用正则表达式


如果没有其他东西,它应该给你一个选择来尝试。

使用
td
以外的东西作为颜色的占位符怎么样?
'code name{color}a001'。替换({color},'blue'))
regex有HTML格式。@Cerbrus我也想将蓝色替换为黄色,所以我不能使用占位符。很好。比我的方式简单得多!非常感谢。这就是我想要的!
<tr>
    <td>Code /blue name blue A001</td>
    <td>Madam blue</td>
    <td><font color="red">do your job</font></td>
</tr>
var dw = new DomWalker();
dw.on('text', function(node) {
    node.nodeValue = node.nodeValue.replace(/red|td/ig, 'blue');
});
dw.walk(document.getElementById('myRow'));