PHP preg_replace: строковый объект json

У меня есть проблема с регулярным выражением, которую я не могу решить самостоятельно, у меня есть строковый файл 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);

к сожалению, мое регулярное выражение не учитывает последний элемент, который не заканчивается запятой , но с кронштейном ]

любая помощь очень ценится. заранее спасибо.

0

Решение

Перейдите пример 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

Другие решения

Не могли бы вы попробовать эту функцию и посмотреть, подходит ли она вам?

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

Я надеюсь, что это поможет немного …. 😉

1

Вы можете использовать это регулярное выражение:

{\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"[^}]*}
0
По вопросам рекламы [email protected]