代码之家  ›  专栏  ›  技术社区  ›  mehulmpt

超时regex以避免灾难性的回溯

  •  1
  • mehulmpt  · 技术社区  · 6 年前

    如何在javascript(runtime=browser)中为regex调用添加超时,使其不会发生灾难性的回溯?我只找到了 NodeJS 以及其他语言,但不适用于javascript。有人知道一个好的解决方案吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   KevBot    6 年前

    您可以在浏览器中启动一个web工作者,并在任何时候终止它。以下示例演示如何在工作进程运行完其所有内容之前终止它:

    (我正在从一个blob创建一个工人,用于演示目的。此外,这是在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);