如何改进正则表达式以删除 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
修饰符。
此正则表达式用于从聚合的 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
修饰符。