PHP preg_replace一个json字符串化对象

时间:2016-05-09 16:08:36

标签: php json object preg-replace stringify

我有一个我无法自己解决的正则表达式挑战,我有一个json字符串化文件,其中包含大量条目,因此不是解码它而是循环遍历所有项目我只想使用preg_replace删除具有特定ID的特定项目。

所以我的json看起来像这样:

    [  
          {  
             "id":"440",
             "type":"prospect",
             "fullname":"elizabeth cogelizabeth",
             "phone":"01768413081",
             "..." : ""
          },
          {  
             "id":"436",
             "type":"prospect",
             "fullname":"mandy cogmandy",
             "phone":"01697349008",
             "..." : ""
          }
]

我所知道的是id部分所以我可以做这样的事情

preg_replace('/{\"id\"\:\"440\".*?\"},/', '', $jsonBlob);

不幸的是,我的正则表达式不会计算最后一个不以逗号,结尾但带括号]

的项目

任何帮助都非常感谢。提前谢谢。

3 个答案:

答案 0 :(得分:1)

使用id循环访问JSON示例,在您的情况下,您不需要使用unset()。

$json = '[  
          {  
             "id":"440",
             "type":"prospect",
             "fullname":"elizabeth cogelizabeth",
             "phone":"01768413081",
             "..." : ""
          },
          {  
             "id":"436",
             "type":"prospect",
             "fullname":"mandy cogmandy",
             "phone":"01697349008",
             "..." : ""
          }
]';
$arr = json_decode($json,true);
foreach($arr as $key => $value) {
if($value['id']==436) { 
unset($arr[$key]); // delete this entry from results
// $value = your_new_json_object {id,type,..}
}
}
print_r($arr);

Fiddle

答案 1 :(得分:1)

您是否介意尝试使用此功能并查看它是否适合您?

    <?php


        // PASS IN THE ID YOU WANNA FILTER-OUT AS $id,
        // 2ND PARAMETER IS THE JSON STRING
        // 3RD PARAMETER IS THE REPLACEMENT STRING: IN YOUR CASE EMPTY: ""
        function removeJsonBlock($id, $jsonSTR, $replacement="YEAH!!! IT WORKS!!!"){
            $jsonSTR      = trim($jsonSTR);
            $filteredJson = preg_replace('#(\{\s*)([\'\"]id[\'\"]\:)(\s?[\'\"])' . trim($id) . '([\'\"])([\w,\.;\"\'\-\?\:\s_\n\r]+)(\},?)#si', $replacement, $jsonSTR);
            return $filteredJson;
        }

        // THE JSON STRING IN QUESTION - REGARDLESS OF WHETHER DYNAMIC OR NOT.
        $jsonSTR =<<<JSS
        [
              {
                 "id":"440",
                 "type":"prospect",
                 "fullname":"elizabeth cogelizabeth",
                 "phone":"01768413081",
                 "..." : ""
              },
              {
                 "id":"436",
                 "type":"prospect",
                 "fullname":"mandy cogmandy",
                 "phone":"01697349008",
                 "..." : ""
              },
              // ADD ANOTHER NODE WITH THE SAME ID OF 440 FOR EXAMPLE...
              {
                 "id":"440",
                 "type":"prospect",
                 "fullname":"elizabeth cogelizabeth",
                 "phone":"01768413081",
                 "..." : ""
              },
        ]
JSS;

        // TEST THE SIMULATION... IT SHOULD REMOVE EVERY ENTRY WITH ID: 440
        var_dump(removeJsonBlock(440, $jsonSTR));


        //

我希望它有所帮助......; - )

答案 2 :(得分:0)

您可以使用此正则表达式:

{\s*"id":"440"[^}]*}

作为一个字符串:

$re = "/{\\s*\"id\":\"440\"[^}]*}/im";

这假设id是JSON数组中的第一个值,但它将占空白。它使用[^}]*来获取}的所有内容。

由于您正在寻找删除该项目,因此可以更改正则表达式以在匹配之前或之后查找逗号。如果它是数组中唯一的东西,我还提供了一个匹配项的方法:

,\s*{\s*"id":"440"[^}]*}|{\s*"id":"440"[^}]*}\s*,|{\s*"id":"440"[^}]*}

启用x间距后更容易阅读:

,\s*{\s*"id":"440"[^}]*}    |
    {\s*"id":"440"[^}]*}\s*,|
    {\s*"id":"440"[^}]*}