首页 > 解决方案 > 超时正则表达式以避免灾难性的回溯

问题描述

如何在 JavaScript(运行时 = 浏览器)中为 Regex 调用添加超时,以免灾难性地回溯?我只找到了适用于NodeJS和其他语言的解决方案,但没有找到适用于 JavaScript 的解决方案。有谁知道一个好的解决方案?

标签: javascriptregex

解决方案


您可以在浏览器中启动 Web Worker,并随时终止它。以下示例演示了在工作人员完成运行它所拥有的所有内容之前终止它:

(出于演示目的,我正在从 blob 创建一个工作人员。此外,这是在 Chrome 中完成的,并且可能需要一些特定于浏览器的更改才能在其他浏览器中工作,例如这个问题中所示

const workerScript = `
    setTimeout(function () {
	  postMessage('You will see this');
    }, 1000);
    setTimeout(function () {
	    postMessage('You will NOT see this');
    }, 5000);
`;

const blob = new Blob([workerScript], {type: 'application/javascript'});
const worker = new Worker(URL.createObjectURL(blob));

worker.onmessage = function(e) {
  console.log(e.data);
};

// You will only see ONE log from the worker
// if you change the timeout (ex. 6000), you will see two
setTimeout(() => {
  worker.terminate();
}, 3000);


推荐阅读