我有一个我无法自己解决的正则表达式挑战,我有一个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);
不幸的是,我的正则表达式不会计算最后一个不以逗号,
结尾但带括号]
任何帮助都非常感谢。提前谢谢。
答案 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);
答案 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"[^}]*}