如何使用Python在文件中搜索JavaScript变量?

时间:2014-10-14 10:28:47

标签: javascript python

我有许多JaveScript文件的目录。在这里,我想扫描每个文件,并希望用'str1''str2''str3',...,'strn'等字符串替换每个JavaScript变量。

我的问题是:如何识别JavaScript变量?

疑惑:

  1. 如果我说var之后的关键字是变量,那么在声明变量时没有强制var

  2. 如果我说=之前的关键字是变量,但是文件也包含HTML代码,因此在HTML标记内部属性与其值之间会有=符号。

    < / LI>

    那么如何识别我必须替换的变量?

2 个答案:

答案 0 :(得分:2)

这看起来像是JavaScript解析器的工作。 slimit是一个Python包,允许您解析JavaScript代码并为其构建AST。然后你可以导航AST寻找变量。或者,如果您正在处理可能在语法上无效的JavaScript,则可以使用slimit的词法分析器。

使用解析器的示例:

from slimit.parser import Parser
from slimit.visitors import nodevisitor
from slimit import ast

js = '''
var x = 100;
var y = 200;
s = 'This is a string';
for (var i=0; i<10; i++) {
    x--;
    y = y * 2;
}
'''

identifiers = set()    
tree = Parser().parse(js)
for node in nodevisitor.visit(tree):
    if isinstance(node, ast.Identifier):
        identifiers.add(node.value)

>>> print "Found identifiers: {}".format(', '.join(identifiers))
Found identifiers: y, x, s, i

或者仅使用词法分析器:

from slimit.lexer import Lexer

js = '''
var x = 100;
var y = 200;
s = 'This is a string';
while (var i=0; i<10; i++) {    // invalid while statement
    x--;
    y = y * 2;
}
'''

identifiers = set()
lexer = Lexer()

lexer.input(js)
for token in lexer:
    if token.type == 'ID':
        identifiers.add(token.value)

>>> print "Found identifiers: {}".format(', '.join(identifiers))
Found identifiers: y, x, s, i

答案 1 :(得分:-3)

如果你使用像phpstorm这样的IDE,它可以很容易地为你找到变量。我没有看到用Python编程来实现这一目的。