У меня есть проблема с регулярным выражением, которую я не могу решить самостоятельно, у меня есть строковый файл json, который содержит много записей, поэтому вместо его декодирования и циклического перебора всех элементов, которые я хочу, просто используйте preg_replace
удалить определенный элемент с определенным идентификатором.
так что мой 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);
к сожалению, мое регулярное выражение не учитывает последний элемент, который не заканчивается запятой ,
но с кронштейном ]
любая помощь очень ценится. заранее спасибо.
Перейдите пример 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);
Не могли бы вы попробовать эту функцию и посмотреть, подходит ли она вам?
<?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, но оно будет учитывать пробелы. Оно использует [^}]*
захватить все до }
,
Поскольку вы хотите удалить элемент, регулярное выражение можно изменить, чтобы искать запятые до или после матча. Я также включил способ соответствия элемента, если он является единственным в массиве:
,\s*{\s*"id":"440"[^}]*}|{\s*"id":"440"[^}]*}\s*,|{\s*"id":"440"[^}]*}
Легче читать x
интервал включен:
,\s*{\s*"id":"440"[^}]*} |
{\s*"id":"440"[^}]*}\s*,|
{\s*"id":"440"[^}]*}