Я работал над парсером HTML - и на самом деле он не выполняет синтаксический анализ JavaScript, это намного другая проблема, чем я работаю.Однако он прекрасно изолирует узлы JavaScript внутри HTML-страницы.
См. @: http://developer.torello.directory/JavaHTML/index.html
Вот мой код, чтобы ответить на ваш вопрос:
import Torello.HTML.*;
import Torello.Java.*;
import java.util.regex.*;
import java.util.*;
import java.io.*;
public class Functions
{
private static final Pattern GET_FUNCTION_PATTERN = Pattern.compile("\\sfunction\\s+(\\w+)");
public static void main(String[] argv) throws IOException
{
Vector<String> results = new Vector<String>();
Vector<HTMLNode> page = HTMLPage.getPageTokens(new java.net.URL(argv[0]), false);
int[] scriptNodes = TagNodeFind.all(page, TC.OpeningTags, "script");
System.out.println("page.size():\t" + page.size());
System.out.println("scriptNodes.length:\t" + scriptNodes.length);
for (int scriptNodePos : scriptNodes)
{
Vector<HTMLNode> script = TagNodeGet.firstInclusive(page, scriptNodePos, -1, "script");
for (HTMLNode n : script)
if (n instanceof TextNode)
{
// System.out.println("TextNode:\t" + n.str + "\n");
Matcher m = GET_FUNCTION_PATTERN.matcher(n.str);
while (m.find()) results.add(m.group(1));
}
}
for (String res : results) System.out.println(res);
}
}
Вот некоторые результаты:
http://StackOverflow.com (нет реальных функций JavaScript, содержащих имена - много анонимных функций)
rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://www.stackoverflow.com/
page.size(): 11078
scriptNodes.length: 12
http://news.yahoo.com Работает нормально, несколько именованных функций...
rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://news.yahoo.com
page.size(): 2911
scriptNodes.length: 32
_perfMark
_perfMeasure
_pushAdPerfMetric
_fireAdPerfBeacon
_onloadEvtHandler
_darlaErrHandler
onDarlaIdle
http://wikipedia.org - аналогично StackOverflow - только анонимные функции.
rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://wikipedia.org
page.size(): 3016
scriptNodes.length: 4
http://flickr.com - имеетнесколько ... Я не на 100% на своем "решении", но этот тип вещей является тем, что интересно в SO ... (хотя не обязательно для вас!)
rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://flickr.com
page.size(): 472
scriptNodes.length: 9
flush
decrementRequestPending
createScriptNode
load
ПРИМЕЧАНИЕ: Если я настрою файл Pattern.com с: Pattern.compile("\\wfunction\\s+(\\w+)")
на Pattern.compile("function\\s+(\\w+)")
, я получу его от StackOverflow.com (интересные имена функций JavaScript):
rtorello75@cloudshell:~ (rpt-chinese)$ java Functions https://www.stackoverflow.com/
page.size(): 11102
scriptNodes.length: 12
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w