如何改进正则表达式以删除 js 文件中的源映射 URL 以避免灾难性的回溯

How to improve regex for removing source map URLs in js files to avoid catastrophic backtracking

此正则表达式用于从聚合的 js 文件中删除源映射 URL。

// Remove JS source and source mapping urls or these may cause 404 errors.
$contents = preg_replace('/\/\/(#|@)\s(sourceURL|sourceMappingURL)=\s*(\S*?)\s*$/m', '', $contents);

当源映射 url 是一个大的 //# sourceMappingURL=data:application/json;charset=utf-8;base64,... base64 编码字符串时,它失败了 PREG_BACKTRACK_LIMIT_ERROR = 灾难性回溯我在一些 riotjs 应用程序文件中。

请参阅 https://regex101.com/r/dB6dL1/1,我在其中仅使用相关较大文件中的失败代码段对此进行了测试。 (注意这需要相当长的时间,直到处理完成并出现错误。

我尝试遵循针对这些问题的建议并在 regex101.com 上使用正则表达式调试器 - 但即使在几分钟后我也没有从调试器中得到任何结果。似乎有很多数据/迭代。

此外,我通过 http://www.regular-expressions.info/catastrophic.html 解释如何解决这个问题阅读了好几遍。但我有点迷失在这里,达到了我的正则表达式知识的极限。有人能告诉我在这种情况下灾难性文章的哪些改进建议是正确的,以及如何改进上面的正则表达式吗?

实际上是您的惰性量词 \S+? 是导致 灾难性回溯的最大罪魁祸首

您可以使用这个重构的正则表达式来解决问题:

$re = '~//[#@]\s(source(?:Mapping)?URL)=\s*(\S+)~';

也不需要使用m修饰符。

RegEx Demo