Php 如何改进regex以删除js文件中的源映射URL以避免灾难性的回溯

Php 如何改进regex以删除js文件中的源映射URL以避免灾难性的回溯,php,regex,pcre,Php,Regex,Pcre,此正则表达式用于从聚合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/

此正则表达式用于从聚合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时,它会失败,并出现
PREG\u BACKTRACK\u LIMIT\u ERROR
=灾难性回溯;字符集=utf-8;base64,…
base64编码字符串我在一些riotjs应用程序文件中有

看看我在哪里测试了这个,只测试了大文件中失败的代码片段。(注意这需要相当长的时间,直到处理完成并显示错误

我试图按照建议解决这些问题,并在regex101.com上使用regex调试器,但即使几分钟后,调试器仍没有结果。似乎需要大量的数据/迭代


另外,我读了好几遍关于如何解决这个问题的解释。但我在这里有点迷茫,已经达到了我的正则表达式知识的极限。有人能告诉我,在这种情况下,这篇灾难性文章的哪些改进建议是正确的,以及如何改进上面的正则表达式吗?

它实际上是你的懒惰量词
\S+?
这是造成灾难性回溯的最大罪魁祸首

您可以使用此重构正则表达式来修复此问题:

$re = '~//[#@]\s(source(?:Mapping)?URL)=\s*(\S+)~';
也不需要使用
m
修饰符