regex.test() 冻结网页



我正在编写一个提取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()也没有用。

谢谢。

使组内的点或连字符模式成为强制性的,以避免随之而来的+/* -量词模式匹配相同的字符:

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

在此处查看正则表达式如何针对您的字符串优雅地失败。

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

此外,您可以使用非捕获组,因为您对获取这些子匹配项不感兴趣(实际上在 JavaScript 中您不能(。

最新更新