javascript 使用正则表达式捕获包裹特定文本但排除 html 标记属性

javascript to wrap specific text using regex capture but exclude html tag attributes

我有针对作为产品编号的字母数字字符串的正则表达式(所有这些都是 CAP/number 各种长度的组合)将这些产品编号包装在粗体标签中,用于生成数百封 HTML 电子邮件.

这对粗体产品编号非常有用,而且还能在我的 HTML 电子邮件的标签属性中捕获 URL 和十六进制颜色的随机部分。

我尝试排除十六进制颜色,只包含“>”之后和“<”之前的文本。这些似乎并没有省略某些 URL 和十六进制颜色。示例...来自此正则表达式并替换语法:

var newHtml = html.replace(new RegExp(/([0-9][^ ]*[A-Z][^ ]*)|([A-Z]
[^ ]*[0-9][^ ]*)(?=[^<|&lt;|http|#]*(>|&gt;|$))/g),"
<strong></strong>");

and this text, from which I only want to wrap 09D623 that appears outside of tags:

Lorem ipsum <a href="http://www.example.com/09D623" target="blank"  
style="color: #66BB12;">dolor sit</a> amet, 09D623 non pulvinar nunc
egestas. Nunc sit amet imperdiet 09D623 magnat.

我仍然捕获 66BB12,标签内的十六进制颜色以及颜色后面的额外字符,以及包含 caps/numbers 的随机 URL,例如本例。我试图用这个排除十六进制颜色: ^(#[0-9a-f]{3}|[0-9a-f]{6})$

另外,使用此表达式标记内容: (?!([^<]+)?>)

但其中 none 似乎按预期工作。我什至不确定我的 exclude 表达式是否正确——当它跟在我开始的表达式之后时 遵循新的 RegExp...以上。

感谢您分享任何见解...

测试在 https://regex101.com/r/rW6iL6/13 或者,

我对字符串的了解还不够,无法更好地概括这一点,但它符合您在示例中查找的内容:

var email = 'Lorem ipsum <a href="http://www.example.com/09D623" target="blank" style="color: #66BB12;">dolor sit</a> amet, 09D623 non pulvinar nunc egestas. Nunc sit amet imperdiet 09D623 magnat.';
var modded = email.replace(/(\s\d+[A-Z]+\d+\s)/g, "<strong></strong>");
document.write(modded);

所以你的正则表达式看起来比它需要的要复杂得多:

\s([0-9A-Z]{2,})\s 在示例中完美地匹配了您想要的内容:

查找任何由空格包围的 2 个或更多字符的匹配项,并仅捕获数字。

您也可以在边缘添加允许的标点符号,但只要您不使用 #;,它就不会匹配十六进制:

[.,-"' ]([0-9A-Z]{2,})[.,-"' ] 将匹配可能接近产品编号的大多数其他选项

如果你想根据 >< 的位置来做:

>[^<]*?([0-9A-Z]{2,})(?:[^<]*?([0-9A-Z]{2,}))*

这允许它在任何非标签字符串中查找任意数量的产品编号,并且 return 每个 >< 最多 2 个结果。如果你需要更多,你可以链接更多,但这就是 regex capture group 的做法。