regex.test()冻结网页

时间:2019-07-12 13:04:14

标签: javascript regex tags

我正在编写一个提取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)
  1. 为什么会发生此错误?
  2. test()可以替代吗? match()也不起作用。

谢谢。

1 个答案:

答案 0 :(得分:1)

在组必须内设置点或连字符模式,以避免随后的+ / *量词模式匹配相同的字符:

\w+(?:[.-]\w+)*@\w+(?:[.-]\w+)*(?:\.\w{2,3})+

查看正则表达式如何针对字符串here正常失败。

请注意,所有[\.-]?都变成了[.-],整个[.-]\w+组仍然是可选的,因为*匹配0个或多个匹配项。点在字符类中没有任何特殊之处,这就是为什么我删除了反斜杠。

此外,您可能会使用非捕获组,因为您不希望获得这些子匹配项(实际上您无法使用JavaScript)。