Base64 正则表达式测试导致 RangeError:超出最大调用堆栈大小

问题描述 投票:0回答:1

我有一个正则表达式需要检查 base64 是否有效。目前我在 NodeJS 中的代码如下所示:

let base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;
if (base64regex.test(Payload.fileData) === true) {
 //Further process the filedata
}

对于不超过 1.6MB 的较小的 Base64 文件,正则表达式工作正常,但对于较大的文件(> 2MB),它会导致:

RangeError: Maximum call stack size exceeded
    at RegExp.test (<anonymous>)

如何接受更大的 Base64 数据而不导致堆栈大小超出错误?

我在 stackoverflow 上看到了一些例子,但没有一个人遇到过这个问题。 base64regex.test() 调用是否递归发生?如果是这样,我该如何解决这个问题?

javascript node.js regex base64
1个回答
0
投票

而不是正则表达式 - 这可能会导致最大调用堆栈大小问题,例如这个
您可以尝试使用另一种方法,例如:

const isValidBase64 = b => {
  try {
    return b.length > 3 && !(b.length % 4) && atob(b) && true;
  } catch(err) {
    return false;
  }
}

// Example:
console.log(
  isValidBase64(""),         // false
  isValidBase64("a"),        // false
  isValidBase64("aZ="),      // false
  isValidBase64("aZ+9===="), // false
  isValidBase64("aZ+9&Š=="), // false
  isValidBase64("aZ+9"),     // true
  isValidBase64("aZ+9/B=="), // true
);

(使用大小 >18Mb 的图像进行测试)

© www.soinside.com 2019 - 2024. All rights reserved.