如何将包含多个js语句的字符串拆分为一个字符串数组,每个字符串包含一个语句
How can I split a string containing multiple js statements into an array of strings each string containing one statement?
>我有一个字符串,其中包含许多用";"分隔的JavaScript语句。
我需要将其拆分为一个字符串数组,每个字符串包含一个单独的命令。
我不能简单地使用带有";"作为分隔符的字符串拆分函数,因为";"也存在于字符串中的其他命令中。
如何将包含多个 js 语句的字符串拆分为一个字符串数组,每个字符串包含一个单独的命令?
例如,我可以有这样的东西:
$('_32123').innerHTML="<div style='"font-size:11px;margin-right:15px;margin-
bottom:5px;text-align:right;'" id='"_134607'" noprint='no' noprintoverflow='no'>
</div>";document.onkeydown = function(event) { if (event.ctrlKey &&
event.keyCode == 89) Event(3160,'Refresh',{ q:'' }); };
是否有可以提供此功能的库或其他东西,或者我还能如何解决这个问题?
正则表达式太简单了,无法将 JavaScript 代码拆分为语句。这可以用于简单的事情,但是有JavaScript字符串,JavaScript正则表达式和注释使这更加复杂。此外,JavaScript 构造不一定以分号结尾。考虑一下:
if (foo) { throw "bar"; }
虽然throw "bar";
以分号结尾,但不清楚您是要捕获整个 if 语句及其正文还是仅捕获throw
部分。除此之外,JavaScript 语句也可能以换行符结尾。以下是两个有效的 JavaScript 语句,但不用分号分隔:
a = 1
b = 2
为了处理所有这些复杂的规则,您将需要一个语言感知解析器。有几个JavaScript解析框架,你必须选择一个适合你的解析器框架。
下面是使用 Acorn 标记语句的示例。使用 npm install acorn
安装 acorn 后,我在 nodejs 中运行了以下代码:
var code = "$('_32123').innerHTML='"<div style='''"font-size:11px;margin-right:15px;margin-bottom:5px;text-align:right;'''" id='''"_134607'''" noprint='no' noprintoverflow='no'></div>'";document.onkeydown = function(event) { if (event.ctrlKey && event.keyCode == 89) Event(3160,'Refresh',{ q:'' }); };";
var acorn = require("acorn");
var tokens = acorn.parse(code);
tokens.body.forEach(function(token) {
console.log("statement: ", code.substr(token.start, token.end - token.start));
});
这将打印示例代码中的两个顶级语句。
请注意,您提供的示例 JavaScript 代码只有两个顶级语句(两个赋值表达式),但总共有两个以上的语句。例如,还有一个函数声明和一个 if 语句。这些语句是两个顶级语句的子语句。
如果要单独捕获所有这些语句(顶级语句和子语句),则需要遍历解析器生成的抽象语法树,并递归为子标记。递归也是必要的,因为JavaScript允许嵌套结构(控制结构,函数)。
这很容易变得更加复杂,因为您必须处理不同的子令牌类型。下面是一个仅处理几种类型的示例实现,演示了如何遍历 AST:
var code = "$('_32123').innerHTML='"<div style='''"font-size:11px;margin-right:15px;margin-bottom:5px;text-align:right;'''" id='''"_134607'''" noprint='no' noprintoverflow='no'></div>'";document.onkeydown = function(event) { if (event.ctrlKey && event.keyCode == 89) Event(3160,'Refresh',{ q:'' }); };";
var acorn = require("acorn");
var tokens = acorn.parse(code);
function recursiveDump(token, level) {
var pad = Array(level).join(" ");
console.log(pad + "- token");
console.log(pad + " - type: " + token.type);
console.log(pad + " - code: " + code.substr(token.start, token.end - token.start));
if (token.type === 'ExpressionStatement') {
if (token.expression.left) {
console.log(pad + " - children:");
recursiveDump(token.expression.left, level + 3);
recursiveDump(token.expression.right, level + 3);
console.log();
}
}
else if (token.type === 'IfStatement') {
console.log(pad + " - children:");
recursiveDump(token.test, level + 3);
recursiveDump(token.consequent, level + 3);
if (token.alternate !== null) {
recursiveDump(token.alternate, level + 3);
}
console.log();
}
else if (token.hasOwnProperty("body")) {
console.log(pad + " - children:");
var body = token.body;
if (! Array.isArray(body) && body.hasOwnProperty("body")) {
body = body.body;
}
body.forEach(function(token) {
recursiveDump(token, level + 3);
});
console.log();
}
}
tokens.body.forEach(function(token) {
recursiveDump(token, 0);
});
这只是一般如何处理子令牌的一个快速示例。如果您只需要处理顶级语句,则可以保存所有这些工作。
- 在Javascript中将一个值和字符串数组转换为if语句
- 替换.each语句中字符串中的字符
- 在元素中搜索字符串,然后将其放入条件语句中
- If.else语句检查NaN和空字符串是否在JavaScript中不起作用
- If语句出现字符串问题
- WebSQL:处理SQL时出错:数量为''语句字符串中的s与参数计数不匹配
- 串联字符串,缺少 ;在语句之前
- 如何从字符串执行 JS 语句
- JQuery if 语句基于在文本中包含特定字符串将数据追加到相应的 DIV
- 将变量日期与 if/else 语句中的日期(日期字符串)进行比较
- 下划线.js if 语句上的字符串连接
- Javascript 正则表达式条件语句,当在字符串中检测到两个相同字符时
- 如果语句运行,则为空字符串
- 关于字符串串联的令人困惑的 JavaScript 语句
- 介绍JS学生使用isNaN(与其他语句结合使用)提取字符串
- 如何将if语句更改为接受字符串而不是整数
- 比较 IF 语句中的字符串
- 如何在IF语句中的字符串中使用条件
- NodeJS Bug?执行在要返回的字符串之前带有换行符的返回语句时出错
- 如何使用js在字符串(语句)之间添加/删除文本