【问题标题】:regex.test() freezes webpageregex.test() 冻结网页
【发布时间】:2019-07-12 13:04:14
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: javascript regex tags


    【解决方案1】:

    使组内的点或连字符模式强制以避免随后的+/*-quantifier 模式匹配相同的字符:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多