代码之家  ›  专栏  ›  技术社区  ›  vishwas jadav

如何检查字符串是否是php中的javascript对象?

  •  0
  • vishwas jadav  · 技术社区  · 8 年前

    我这里有一根绳子:

    {eventStart: "2018/12/01",eventEnd: "2018/12/01"}
    

    我想检查这是否可以成为一个有效的js对象。 如果要进行ajax调用,我们会这样写:

    $.ajax({
        type: "post",
        url: "something",
        data: data
    })
    

    如果缺少逗号或倒逗号,则会出现语法错误。我想在php中检查这个字符串是否可以成为一个有效的js对象。

    上面的例子,将只检查

    {
        type: "post",
        url: "something",
        data: data
    }
    

    编辑

    我可以检查有效的json,但是json_decode函数中的有效json应该是这样的:

    {
        "type": "post",
        "url": "something",
        "data": data(valid object here)
    }
    

    但是当我们写代码的时候

    {
    键入:“post”,
    网址:“某物”,
    数据:数据
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   apokryfos    8 年前

    你不应该这样做 在里面 但可以在浏览器或任何其他合适的JavaScript解释器中使用。

    在PHP中这样做最终可能会类似于构建自己的JavaScript解析器。

    我的建议是:

    1. 安装Node.js
    2. 运行此PHP脚本:

      $obj = '{eventStart: "2018/12/01",eventEnd: "2018/12/01"}';
      $cmd = "/usr/bin/node -e \"var a = $obj; console.log(typeof a);\"";
      $ph = proc_open($cmd, [
          [ "pipe", "r"  ],
          [ "pipe", "w"  ],
          [ "pipe", "w"  ]
      ], $pipes);
      
      $error = stream_get_contents($pipes[2]);
      $result = stream_get_contents($pipes[1]);
      fclose($pipes[0]);
      fclose($pipes[1]);
      fclose($pipes[2]);
      proc_close($ph);
      
      if (empty(trim($error)) && trim($result) == "object") {
         echo "Yay it's an object";
      } else if (!empty($error)) {
         echo "Not valid JS syntax";    
      } else {
         echo "It's a ".trim($result)." instead of an object";
      }
      

    或者只在浏览器中添加签入,如下所示:

    <?php
       $obj = '{eventStart: "2018/12/01",eventEnd: "2018/12/01"}';
    ?>
    <script>
        try {
          var parameter = <?=$obj?>;
          if (typeof parameter !== 'object') {
              throw new Error('Not an object');
           }
        } catch (e) {
           //not valid
        }
     </script>
    

    注意:我刚刚意识到这可能是XY问题。

    当 {eventStart: "2018/12/01",eventEnd: "2018/12/01"} 可能是一个有效的JS对象跨平台共享JS对象的最佳方法是使用JSON(JavaScript对象表示法的缩写)。这里最好的解决方案是确保传递给客户机的任何内容都是json编码的。例如:

    <?php
       //Note how this is a PHP assoc array
       $obj = [ "eventStart" => "2018/12/01", "eventEnd" => "2018/12/01" ];
    ?>
    <script>
        var object = <?= json_encode($obj); ?>;
    </script>
    
        2
  •  0
  •   Doğan Uçar    8 年前

    尝试在PHP端解析 json_decode . 如果有效,方法将返回数组。如果没有,那么您将得到false/null,如文档中所定义的:

    以适当的PHP类型返回以json编码的值。价值观 true、false和null返回为true、false和null 分别是。如果无法解码json或 编码数据的深度超过递归限制。