将字符串转换为可存储的变量名称和值(作为字符串和对象)

时间:2011-06-28 13:08:49

标签: javascript regex string replace

  

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";

上面有一个对象,其中包含:带空格(和“)的字符串,引用

感谢。

1 个答案:

答案 0 :(得分:3)

四个选项/想法/建议:

1。使用JSON

如果您控制源格式,我建议您使用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"
}

如您所见,唯一的区别是:

  1. 用花括号({})包装整个东西。
  2. 您将“变量”名称(属性名称)放在双引号中。
  3. 在属性名称后面使用冒号而不是等号。
  4. 您使用逗号而不是分号来分隔属性(就像您在exampleVariable行上的对象文字一样)。
  5. 您确保任何字符串值都使用双引号而不是单引号(JavaScript允许; JSON更具限制性)。您的示例使用双引号,但我提到它以防万一......
  6. 2。使用正则表达式

    将其预处理为JSON

    如果您无法控制源格式,但它正如您所示 ,则可以通过正则表达式将其重新格式化为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}}在引号内......

    3。 实际上通过修改JSON解析器来解析它以支持您的格式

    如果你不能改变格式,并且它不如你引用的例子那么精确,那么你将不得不进行实际的解析;没有捷径(好吧,没有可靠的)。实际上解析JavaScript文字(我假设你的数据中没有表达式,当然除了赋值表达式)并不是那么糟糕。您可以使用JSON解析器并根据需要对其进行修改,因为它已经具有几乎所有文字逻辑。 Crockford的github页面上有两个(Crockford是JSON的发明者),one using recursive descentanother using a state machine。做出选择并开始黑客攻击。

    4。邪恶的eval

    我想我应该在这里提到eval,虽然我不建议你使用它。 {{1}}从字符串运行任意JavaScript代码。但是因为它运行你提供的任何代码,所以反序列化这样的东西不是一个好的选择,任何自由变量(比如你引用的那些)最终都会成为全局变量。真的非常难看,我大多提到它是为了说:不要使用它。 : - )