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

时间:2016-06-28 04:04:40

标签: javascript regex html-email

我已经使用正则表达式定位字母数字字符串,这些字符串是产品编号(所有将是不同长度的CAP /数字组合),将这些产品编号包装为数百个生成的HTML电子邮件的粗体标记。

这非常适合大胆的产品编号,但也可以在HTML电子邮件的标记属性中捕获URL和十六进制颜色的随机部分。

我尝试排除十六进制颜色,并且只包含">"之后的文字。之前"<"。这些似乎不会忽略某些网址和十六进制颜色。示例...来自此正则表达式并替换语法:

var newHtml = html.replace(new RegExp(/([0-9][^ ]*[A-Z][^ ]*)|([A-Z]
[^ ]*[0-9][^ ]*)(?=[^<|&lt;|http|#]*(>|&gt;|$))/g),"
<strong>$1</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,标签内的十六进制颜色以及颜色后面的额外字符,以及随机网址(如果它们包含大写/数字,例如此示例)。我尝试使用以下方法排除十六进制颜色:     ^(#[0-9A-F] {3} | [0-9A-F] {6})$

并单独使用此表达式标记内容:     (?!([^&LT;] +)&GT;?)

但这些似乎都没有按预期工作。我甚至不确定我的排除表达是否正确 - 当它跟随我开始的表达式时 跟随新的RegExp ......上面。

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

测试位于https://regex101.com/r/rW6iL6/13或者, test results at regex101, showing blue highlighted matches

2 个答案:

答案 0 :(得分:0)

我不太了解字符串以更好地概括这一点,但它与您在示例中寻找的内容相匹配:

LongBool

答案 1 :(得分:0)

所以你的正则表达式似乎比它需要的复杂得多:

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

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

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

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

如果您想根据><的位置进行操作:

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

这允许它查看任何数量的产品编号的非标记字符串,并且每><最多返回2个结果。如果您需要更多,可以链接更多,但regex capture group就是这样。