检测特定文本是否为JavaScript。

3
我有一个文本文件,它的内容可能是普通文本或JavaScript源代码。我需要一种高效而准确的方法来检测文本文件是否包含普通文本或JavaScript代码。 我的方法: 我尝试提取特定语法的关键字、标点符号、运算符、基于正则表达式的循环检测等。我将所有值相加并除以文件长度,得到一个特定的比率。假设该比率大于0.2,则文件为JavaScript,否则为普通文本。我遇到的问题是基于正则表达式的循环检测。对于文件大小大于1 MB的文件,它需要太长时间,因此我放弃了这个方法。
欢迎提供任何资源或方法。谢谢。

2
使用NLP的特定原因是什么?JavaScript不是自然语言,因此有更好的选择。例如,它具有明确定义的语法,那为什么不将其通过JavaScript解析器处理呢? - Sinkingpoint
我也考虑过这个问题,但我正在处理的 JavaScript 实际上是恶意软件。在本地计算机上执行它会有一些问题。我必须在特殊的沙盒环境中执行它,但那将会增加很多额外工作量。 - Esh
@Sinkingpoint,有没有更多关于解析器的链接或资源可以了解一下? - Esh
@Esh,有一些著名的JS解析器,例如esprima、acron等。你可以在谷歌搜索框中简单地输入“js解析器”,就能得到你想要的许多结果。 - Stephen.W
@Esh 如果你的代码又长又复杂,使用完整解析可能需要一些时间。这里有一个粗略的想法,你可以编写一个自定义解析器来识别一些相同的JavaScript语法,例如constlet表达式、var关键字、箭头函数。 - Stephen.W
显示剩余5条评论
1个回答

0

您可以以稍微不同的方式使用NLP——读取整个JS文件,对其进行标记化并构建令牌频率表;使用此数据应用您已经概述的逻辑。我尝试使用wink-nlp6.6MB JS文件上执行此操作,并在intel 2.2GHz i7 MacBook Pro上在约5秒内生成了频率表。以下是Node.js代码供您参考:

const fs = require( 'fs' );
const winkNLP = require( 'wink-nlp' );
const model = require( 'wink-eng-lite-web-model' );
const its = require( 'wink-nlp/src/its.js' );
const as = require( 'wink-nlp/src/as.js' );

const rawJS = fs.readFileSync( '<your-js-file-with-path>', 'utf8' );

const nlp = winkNLP( model );

const doc = nlp.readDoc( rawJS );
// The const ft has the frequency table:
const ft = doc.tokens().out( its.normal, as.freqTable );

以下是部分输出:

[ '\n', 160960 ],
[ '.', 125520 ],
[ '(', 108440 ],
[ '/', 106480 ],
[ '=', 95040 ],
[ ')', 74800 ],
[ ';', 64120 ],
.
.
[ '{', 16640 ],
[ '}', 16640 ],
[ 'const', 15920 ],
.
.

注意:所使用的JS文件是未压缩的。 - sks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接