2015年编辑不要这样做。做个好人,只需使用
JSON.parse()
:)
我试图以类似javascript的语法获取包含变量和值的字符串,并将它们存储在全局对象(gv
)中。我的问题只是解析字符串。
String ( <div>
中的所有内容):
<div id="gv">
variableName = "variableValue,NoSpacesThough";
portal = "TheCakeIsALie";
</div>
脚本(解析上面的字符串,将值放入全局对象):
var s = (document.getElementById("gv").innerHTML).split(';');
for (var i = 0; i < s.length; i++) {
if (s[i] !== "\n" || "") {
s[i] = s[i].replace(/^\s*/gm, "");
var varName = s[i].substr(0, s[i].indexOf('=') - 1),
varValue = (s[i].substr((s[i].indexOf('"') + 1), s[i].length)).replace('"', "");
gv[varName] = varValue;
}
}
结果:
console.log(gv.variableName); //returns: variableValue,NoSpacesThough
console.log(gv.portal); //returns: TheCakeIsALie
问:如何修改此脚本以正确存储这些变量:
exampleVariable = { name: "string with spaces", cake:lie };
variableName = "variableValue,NoSpacesThough";
portal = "The Cake Is A Lie";
上面有一个对象,其中包含:带空格(和“)的字符串,引用
感谢。
答案 0 :(得分:3)
四个选项/想法/建议:
如果您控制源格式,我建议您使用JSON而不是自己动手。该页面的详细信息。 JSON现在是ECMAScript (JavaScript) standard的一部分,具有从对象图创建JSON字符串的标准方法,反之亦然。举个例子:
exampleVariable = { name: "string with spaces", cake:lie };
variableName = "variableValue,NoSpacesThough";
portal = "The Cake Is A Lie";
这是JSON等价物的样子:
{
"exampleVariable": { name: "string with spaces", cake:lie },
"variableName": "variableValue,NoSpacesThough",
"portal": "The Cake Is A Lie"
}
如您所见,唯一的区别是:
{}
)包装整个东西。exampleVariable
行上的对象文字一样)。如果您无法控制源格式,但它正如您所示 ,则可以通过正则表达式将其重新格式化为JSON,然后使用JSON对其进行反序列化东西。但如果格式比你引用的格式更复杂,那就会很快变得毛茸茸。
以下是将您引用的内容转换为JSON的示例(live copy):
function transformToJSON(str) {
var rexSplit = /\r?\n/g,
rexTransform = /^\s*([a-zA-Z0-9_]+)\s*=\s*(.+);\s*$/g,
rexAllWhite = /\s+/g,
lines,
index,
line;
lines = str.split(rexSplit);
index = 0;
while (index < lines.length) {
line = lines[index];
if (line.replace(rexAllWhite, '').length === 0) {
// Blank line, remove it
lines.splice(index, 1);
}
else {
// Transform it
lines[index] = line.replace(rexTransform, '"$1": $2');
++index;
}
}
result = "{\n" + lines.join(",\n") + "\n}";
return result;
}
...但要小心再次依赖于格式与您所显示的完全一致,特别是它依赖于每一个值在一行上,而任何字符串值都在双引号(JSON的要求)。你可能需要处理上面没有处理的复杂性,但你不能用你的第一行var s = (document.getElementById("gv").innerHTML).split(';');
之类的东西来做,这会打破;
上的行,无论;
是否eval
1}}在引号内......
如果你不能改变格式,并且它不如你引用的例子那么精确,那么你将不得不进行实际的解析;没有捷径(好吧,没有可靠的)。实际上解析JavaScript文字(我假设你的数据中没有表达式,当然除了赋值表达式)并不是那么糟糕。您可以使用JSON解析器并根据需要对其进行修改,因为它已经具有几乎所有文字逻辑。 Crockford的github页面上有两个(Crockford是JSON的发明者),one using recursive descent和another using a state machine。做出选择并开始黑客攻击。
eval
我想我应该在这里提到eval
,虽然我不建议你使用它。 {{1}}从字符串运行任意JavaScript代码。但是因为它运行你提供的任何代码,所以反序列化这样的东西不是一个好的选择,任何自由变量(比如你引用的那些)最终都会成为全局变量。真的非常难看,我大多提到它是为了说:不要使用它。 : - )