我正在编写一个提取URL中参数的函数,并且我正在使用正则表达式来识别URL中是否存在电子邮件,以便将其删除。
这是我的功能:
function redactEmail() {
var emailRedacted = "";
try {
var urlparams= window.location.search.replace("?","");
var urlparamsdecoded = decodeURIComponent(urlparams);
emailRedacted = urlparamsdecoded;
var emailRegex = /\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+/;
if (emailRegex.test(urlparamsdecoded)) {
emailRedacted = urlparamsdecoded.replace(emailRegex, '[REDACTED EMAIL]');
}
}
catch (e) {}
return emailRedacted;
}
这可以返回以下内容:
email=[REDACTED EMAIL]
从这里:
https://www.test.com/?email=test@test.com
但是在某些情况下,此功能会阻止整个网站正常工作。
我正在GTM网站上的标签中使用此功能,所以我无法访问该网站的源代码。
网站停止运行的示例是这样的:
https://www.test.com/?token=_JxY5kgHdKMkO8uSYf77sEl9mJhD7NHwAlrsMfJ-1zg
该网站完全停止工作。
我调试了功能,问题出在:
ow_emailRegex.test(ow_urlparamsdecoded)
test()
可以替代吗? match()
也不起作用。谢谢。
答案 0 :(得分:1)
在组必须内设置点或连字符模式,以避免随后的+
/ *
量词模式匹配相同的字符:
\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.\w{2,3})+
查看正则表达式如何针对字符串here正常失败。
请注意,所有[\.-]?
都变成了[.-]
,整个[.-]\w+
组仍然是可选的,因为*
匹配0个或多个匹配项。点在字符类中没有任何特殊之处,这就是为什么我删除了反斜杠。
此外,您可能会使用非捕获组,因为您不希望获得这些子匹配项(实际上您无法使用JavaScript)。