Javascript 将字符串转换为可存储的变量名和值(作为字符串和对象)
2015编辑不要这样做。做一个好人,只需使用Javascript 将字符串转换为可存储的变量名和值(作为字符串和对象),javascript,regex,string,replace,Javascript,Regex,String,Replace,2015编辑不要这样做。做一个好人,只需使用JSON.parse():) 我试图获取一个字符串,该字符串以类似javascript的语法包含变量和值,并将它们存储在全局对象(gv)中。我的问题只是字符串的解析 字符串(在中的所有内容): Q:如何修改此脚本以正确存储这些变量: exampleVariable = { name: "string with spaces", cake:lie }; variableName = "variableValue,NoSpacesThough";
JSON.parse()
:)
我试图获取一个字符串,该字符串以类似javascript的语法包含变量和值,并将它们存储在全局对象(gv
)中。我的问题只是字符串的解析
字符串(在
中的所有内容):
Q:如何修改此脚本以正确存储这些变量:
exampleVariable = { name: "string with spaces", cake:lie };
variableName = "variableValue,NoSpacesThough";
portal = "The Cake Is A Lie";
正上方有一个对象,包含:一个带空格的字符串(和“),一个引用
谢谢。四个选项/想法/建议: 1.使用JSON 如果您可以控制源格式,我建议您使用而不是滚动自己的。该页面上的详细信息。JSON现在是从对象图创建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
行中的对象文字一样)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;
}
函数transformToJSON(str){
变量REXPLIT=/\r?\n/g,
rexTransform=/^\s*([a-zA-Z0-9+)\s*=\s*(.+);\s*$/g,
rexAllWhite=/\s+/g,
线,
指数
线路;
行=str.split(rexslit);
指数=0;
while(索引<行长度){
行=行[索引];
如果(换行(rexAllWhite.),长度==0){
//空白行,删除它
线。拼接(索引,1);
}
否则{
//改造它
行[index]=line.replace(rexTransform,“$1”:$2”);
++指数;
}
}
结果=“{\n”+行。连接(“,\n”)+“\n}”;
返回结果;
}
…但是请注意,这同样取决于格式是否与您显示的格式完全相同,尤其是它取决于每个值都在一行上,任何字符串值都在双引号中(JSON的要求)。您可能需要处理上面没有处理的复杂性,但您无法处理第一行var s=(document.getElementById(“gv”).innerHTML).split(“;”);
,这将打断;
上的行,无论;
是否在引号内
3.通过修改JSON解析器以支持您的格式来实际解析它
如果您无法更改格式,并且它的精确度低于您所引用的示例,那么您必须进行实际解析;没有快捷方式(没有可靠的快捷方式)。实际解析JavaScript文本(我假设数据中没有表达式,当然除了赋值表达式外)没那么糟糕。你可能需要一个JSON解析器并根据需要修改它,因为它几乎已经具备了所有的文本逻辑。Crockford的github页面上有两个(Crockford是JSON的发明者),和。根据你的选择开始黑客攻击
4.邪恶eval
我想我应该在这里提到
eval
,尽管我不建议您使用它。eval
从字符串中运行任意JavaScript代码。但由于它运行您提供的任何代码,因此对于反序列化这样的内容和任何自由变量(如您引用的变量)来说,它不是一个好的选择最终会成为全球性的。真的很难看,我提到它主要是为了说:不要使用它。:-你能修改源格式吗?因为如果可以,我会使用而不是滚动你自己的。谢谢你的信息性回复,TJ。不幸的是,它没有回答我的问题!我可以从技术上改变我拥有的,但这一切都会改变发生的情况是复杂性的增加和对每个变量的附加要求需要在它自己的行上。该站点的HTML可以稍后缩小。你能帮我解决问题吗?@Fullet:再通读一遍,我不确定你是否理解。(而且你还没有回答我的问题。;-)你能改变格式吗?)这里的要点是:如果可能的话,使用JSON而不是你自己的格式。JSON不要求值在单独的行上,我只是说,正则表达式的示例使用虚线表示,确实如此(并且比你引用的需要修改的代码更可靠).为了清晰起见,我将答案分成了四个部分(之前只有三个部分;我添加了第四个部分)。祝你好运,哇,这看起来不错。感谢你给出了这么好的答案!我会在有时间回来讨论这个问题(目前正在工作)时予以确认。
exampleVariable = { name: "string with spaces", cake:lie };
variableName = "variableValue,NoSpacesThough";
portal = "The Cake Is A Lie";
{
"exampleVariable": { name: "string with spaces", cake:lie },
"variableName": "variableValue,NoSpacesThough",
"portal": "The Cake Is A Lie"
}
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;
}