是否有可能编写一个正则表达式来检查字符串(javascript &PHP代码)被最小化


Is it possible to write a regex which checks if a string (javascript & php code) is minified?

是否可以编写一个正则表达式来检查字符串(一些代码)是否被缩小?

许多PHP/JS混淆器删除空白字符(以及其他内容)。因此,最终的简化代码有时看起来像这样:

PHP:
$a=array();if(is_array($a)){echo'ok';}
JS:
a=[];if(typeof(a)=='object'&&(a instanceof Array){alert('ok')}
在这两种情况下,

在"{","}",";"等之前和之后都没有空格字符。还有一些其他的模式也会有所帮助。我不期望一个高精度的正则表达式,只需要一个检查,如果至少100个字符的字符串看起来像缩小的代码。谢谢你的建议。

目的:网络恶意软件扫描

我认为缩小器将剥离所有换行符,尽管如果将缩小的代码粘贴回文本编辑器中,可能在文件末尾仍然有一个换行符。像这样的内容可能相当准确:

/^[^'n'r]+('r'n?|'n)?$/

只是测试除了末尾可能有一个换行符外,整个内容中没有换行符。所以不能保证,但我认为它可以很好地处理任何较长的代码块

简短的回答是"不",regex不能这样做。

最好的方法可能是对源文件进行统计分析,并与一些已知的启发式方法进行比较。例如,通过将变量名与最小化代码中常见的变量名进行比较。最小化的文件可能有很多单字符变量名,例如……并且不会有两个字符的变量名,直到所有的一个字符的变量名用尽…等。

另一个选项是简单地通过最小化器运行源文件,并查看输出是否与输入有足够的不同。如果没有,它可能已经被最小化了。

但我不得不同意sg3s的最后一句话:如果你能解释为什么你需要这个,我们可能会为你的实际需求提供更有用的答案

No。因为语法/代码和它的意图没有改变,一些非常熟悉php和/或js的人会在一行上写简单的函数,根本没有任何空白(me:s)。

你能做的是计算字符串中所有的空白字符,尽管这也不可靠,因为对于某些东西你只需要空白,比如x instanceof y。也不是所有的代码都被压缩到一行(参见jQuery UI),所以你不能指望....

也许你可以解释为什么你需要知道这个,我们可以试着找到一个替代方案?

您无法判断它是被缩小了还是只是手工编写的(可能只适用于较小的脚本)。但是您可以检查它是否包含不必要的空白。

看看开源的obfuscator/minifier,看看他们使用什么规则来删除空白。验证是否应用了这些规则应该可以工作,如果regex变得复杂,可能需要一个简单的解析器。

只要确保像a="if ( b )"这样的字符串字面值被排除。

通过特定语言的解析器运行它(甚至修饰器也可以正常工作),并修改它以计算未使用字符的数量。使用未使用字符的百分比与文档中字符的数量作为最小化的测试。我不认为你可以用regex精确地做到这一点,尽管计算空白与文档内容可能是可以的。