PHP preg_replace一个json字符串化对象


PHP preg_replace a json stringified object

我有一个regex挑战,我自己无法解决,我有一份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);

不幸的是,我的正则表达式没有计算最后一个不是以逗号,结尾而是以括号] 结尾的项

任何帮助都将不胜感激。提前谢谢。

使用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

你介意试试这个函数,看看它是否对你有用吗?

    <?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));

        //

我希望它能有所帮助……;-)

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

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

作为字符串:

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

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

由于您要删除该项,因此可以更改regex以在匹配之前或之后查找逗号。我还包括了一种匹配项目的方法,如果它是数组中唯一的东西:

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

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

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