PHP中的处理部分响应查询字符串

时间:2013-12-10 22:37:38

标签: php regex api

序曲:我做了一些广泛的搜索,或者找不到任何东西,或者没有找到正确的东西。无论哪种方式,如果这是重复,我道歉。现在让我们回答这个问题!

在PHP中处理部分响应查询字符串的最佳方法是什么?我的意思是在API的上下文中。例如,使用Facebook API,您可以使用以下查询字符串请求部分响应:...?fields=id,name,albums.limit(10).fields(id,name,description)

你会得到这样的回复:

{
  "id": "000000000", 
  "name": "Hunter Skrasek", 
  "albums": {
    "data": [
      {
        "id": "58752341440", 
    "name": "Mobile Uploads", 
    "created_time": "2008-12-21T20:08:03+0000"
      }, 
      {
        "id": "189536146440", 
        "name": "Timeline Photos", 
        "created_time": "2009-11-13T04:41:29+0000"
      }, 
      {
        "description": "Where gaming meets the Internet", 
        "id": "10151489643141441", 
        "name": "RTX 2013", 
        "created_time": "2013-07-14T18:20:53+0000"
      }, 
      {
        "id": "10151449802086441", 
        "name": "iPhoto  Photos", 
        "created_time": "2013-06-19T22:57:44+0000"
      },
      ...
    ], 
  }
}

我减少了响应,但正如您所看到的那样,它将字段查询转换为部分响应,不仅针对主要资源,还针对子资源。

所以我正在寻找主要资源和子资源的任何指针或关于如何处理部分响应查询字符串的建议。我正在考虑先在,然后从那里.分裂,但问题就在于,如果没有正则表达式,相册.fields(...)内容会被错误地分割。接下来要弄清楚如何存储整个部分响应,我有这样的想法:

array(2) {
  'fields' =>
  array(2) {
    [0] =>
    string(2) "id"
    [1] =>
    string(4) "name"
  }
  'albums' =>
  array(2) {
    'limit' =>
    int(10)
    'fields' =>
    array(3) {
      [0] =>
      string(2) "id"
      [1] =>
      string(4) "name"
      [2] =>
      string(11) "description"
    }
  }
}

好吧我认为我已经提供了足够的信息,但如果没有,我会很乐意添加更多或详细说明已有的信息。

1 个答案:

答案 0 :(得分:0)

到目前为止,拆分主要资源的代码很简单。如果查询不在括号内,则必须在每个,上进行拆分:

$query = 'id,name,albums.limit(10).fields(id,name,description)';

print_r(parseQuery($query));

function parseQuery($query)
{
  $result = array();
  $lastpos = 0;
  $depth = 0;

  for ($i = 0; $i < strlen($query); $i++)
  {
    if ($query[$i] == "," && $depth == 0)
    {
      array_push($result, substr($query, $lastpos, $i - $lastpos));
      $lastpos = $i + 1;
    } else if ($query[$i] == "(")
    {
      $depth++;
    } else if ($query[$i] == ")")
    { 
      $depth--;
    }
  }

  array_push($result, substr($query, $lastpos, $i - $lastpos));

  return $result; // will return Array ( [0] => id [1] => name [2] => albums.limit(10).fields(id,name,description) )
}

下一个问题是将albums拆分为子资源。您必须在.fields(和匹配的)之间获取内容。然后使用提取的字符串(parseQuery)递归调用id,name,description函数。

我希望这对你有所帮助!