如何在标签中包装不是标签的一部分的文本?

时间:2016-08-28 18:31:58

标签: javascript regex replace

我正在尝试突出显示(<mark)另一个字符串中的搜索字符串,但它不应该是标记的一部分(即te中的<cite>不应该匹配,但te中的test应该)。我一直在使用这样的代码来替换匹配的第二个正则表达式,但只能嵌套。

someElement.innerHTML.replace(regex, function(full, before, match, after) {
  return before + '<mark>' + match + '</mark>' + after;
});

建议我尝试过:

  • <\/\w*>(\w*\s*)*(te)(\w*\s*)*<([a-z]*\s*\w*="\w*")*>(根本不匹配?)
  • (<.+?>[^<>]*?.*)(te)(.*[^<>]*?<.+?>)(仅适用于嵌套代码)
  • ((<.+?>[^<>]*?)?.*)(te)(.*([^<>]*?<.+?>)?).replace给出undefined's)

示例:

要换行的字符串:te

输入文字:

‘This is a test string’
<cite> — some test wrapped too</cite>

预期产出:

‘This is a <mark>te</mark>st string’
<cite> — some <mark>te</mark>st wrapped too</cite>

我浏览了很多“重复”,但找不到一个确切的答案,但如果有人能引导我做一个有效的例子,那也很可爱,谢谢!

现在删除的对我来说最有效的答案是(te)(?![^<]*>)(revo)。但是,如果下一个字符为>,则无效,但我会将其视为未解决的边缘情况。

1 个答案:

答案 0 :(得分:3)

正则表达式:

(te)(?!\w*>)

它可以从负向前瞻中获益,以检查它是否在开/关标签内。 (?!\w*>)这将忽略任何单词字符和te后面的>(可能表示位于标记名称内)。

失败案例:

如果输入字符串中可能存在类似test>(未配对)的字符串,即使它不是标记,也不匹配。

Live demo