我有一个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"[^}]*}