替换两个字符串之间的正则表达式多重匹配

时间:2014-08-19 19:28:01

标签: javascript regex replace

我正在尝试将一些文本转换为html,但是我在构建表格时遇到了麻烦。每个单元格都用括号[]包围。

我已经设置了行:

<tr>[blue][red][yellow][purple][white]</tr>

现在我需要将每个单元格替换为<td>

这样可以正常工作:

.replace(/\[(.*?)\]/g,'<td>$1</td>')

但我不希望在文档的其他部分发生,只是当它位于标签之间时。

这对我有意义,但是不起作用:

.replace(/(<tr>.*?)\[(.*?)\](.*?\<\/tr\>)/g,'$1<td>$2</td>$3')

如果您想尝试,请输入完整的代码:

alert('<tr>[blue][red][yellow][purple][white]</tr>'.replace(/(<tr>.*?)\[(.*?)\](.*?\<\/tr\>)/g,'$1<td>$2</td>$3'));

输出:

<tr><td>blue</td>[red][yellow][purple][white]</tr>

预期产出:

<tr><td>blue</td><td>red</td><td>yellow</td><td>purple</td><td>white</td></tr>

2 个答案:

答案 0 :(得分:0)

您可以通过两个步骤轻松完成此操作:

var str = "<div>[do not replace]</div><table><tr>[blue][red][yellow][purple][white]</tr></table>";

str = str.replace(/(<tr[\s\S]*?>)([\s\S]*?)(<\/tr>)/g, function(m, start, contents, end) {
    return start + contents.replace(/\[([\s\S]*?)\]/g, "<td>$1</td>") + end;
});

alert(str);

请注意,我已将.替换为[\s\S],以模拟JS遗憾缺少的s正则表达式选项。

答案 1 :(得分:0)

在替换函数中使用split / join的方法:

var str = '<tr>[blue][red][yellow][purple][white]</tr>';

var res = str.replace(/<tr>(?:\[[^\]]*\])+<\/tr>/g,
    function (m) {
        return '<tr><td>'
             + m.substring(5, m.length-6).split('][').join('</td><td>')
             + '</td><tr>';
    });

console.log(res);