【问题标题】:Timing out regex to avoid catastrophic backtracking超时正则表达式以避免灾难性的回溯
【发布时间】:2018-06-08 04:43:20
【问题描述】:

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

【问题讨论】:

  • @WiktorStribiżew 这又是 nodejs
  • 你的意思是在浏览器中?
  • 您是否认为正则表达式可能是您要解决的问题的错误工具?
  • 使脚本超时的唯一方法是它是线程化的,而在浏览器中实现这一点的唯一方法是使用网络工作者,这对于这个特定的请求来说似乎有点矫枉过正。
  • 检查 this 可能会对您有所帮助

标签: javascript regex


【解决方案1】:

您可以在浏览器中启动 Web Worker,并随时终止它。下面的例子演示了在一个 worker 完成运行它所拥有的一切之前终止它:

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

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);

【讨论】:

  • 感谢您的回答。我已经采用了网络工作者的方法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2016-10-07
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多