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][^ ]*)(?=[^<|<|http|#]*(>|>|$))/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 的做法。
我有针对作为产品编号的字母数字字符串的正则表达式(所有这些都是 CAP/number 各种长度的组合)将这些产品编号包装在粗体标签中,用于生成数百封 HTML 电子邮件.
这对粗体产品编号非常有用,而且还能在我的 HTML 电子邮件的标签属性中捕获 URL 和十六进制颜色的随机部分。
我尝试排除十六进制颜色,只包含“>”之后和“<”之前的文本。这些似乎并没有省略某些 URL 和十六进制颜色。示例...来自此正则表达式并替换语法:
var newHtml = html.replace(new RegExp(/([0-9][^ ]*[A-Z][^ ]*)|([A-Z]
[^ ]*[0-9][^ ]*)(?=[^<|<|http|#]*(>|>|$))/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 的做法。