2016-05-09 10 views
0

Ich habe eine Regex-Herausforderung, die ich nicht allein lösen kann, habe ich eine JSON-Datei, die viele Einträge enthalten, so statt es zu entschlüsseln und über alle Elemente, die ich will nur eine preg_replace um einen bestimmten Artikel mit einer bestimmten ID zu löschen.PHP preg_replace ein JSON Stringed Objekt

so meine Json wie folgt aussehen:

[ 
      { 
      "id":"440", 
      "type":"prospect", 
      "fullname":"elizabeth cogelizabeth", 
      "phone":"01768413081", 
      "..." : "" 
      }, 
      { 
      "id":"436", 
      "type":"prospect", 
      "fullname":"mandy cogmandy", 
      "phone":"01697349008", 
      "..." : "" 
      } 
] 

, was ich weiß, ist das id Teil, so kann ich so etwas wie dieses

preg_replace('/{\"id\"\:\"440\".*?\"},/', '', $jsonBlob); 

tun kann leider meine regex nicht halten in der letzten Zählung Artikel, der nicht mit Komma endet , aber mit einer Klammer ]

jede Hilfe wird wirklich geschätzt. Danke im Voraus.

+0

Nicht sicher, was Sie meinen, Ihr Beispiel nicht über eine ']' Das sollte dazu führen, '“, 'zu scheitern Ich denke '{\ s *" id ":" 440 ",' oder '{\ s *" id ":" \ d + ",' ist einfacher zu lesen. – chris85

+4

ich glaube nicht, dass es eine ziemlich gute Idee ist mit 'preg_replace' ist das Durchschleifen durch das json_decode Array viel besser –

+2

In der Zukunft werde ich mein Kind '{bobby}' nennen, nur um so einen faulen Code abzuwerfen. –

Antwort

0

können Sie diese Regex verwenden:

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

Als String, ist:

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

Dies setzt voraus, dass id der erste Wert im JSON-Array ist, aber es wird für Leerzeichen berücksichtigen. Es verwendet [^}]*, um alles bis zur } zu greifen.

Da Sie das Element löschen möchten, kann die Regex geändert werden, um vor oder nach dem Match nach Kommas zu suchen. Ich habe auch eine Möglichkeit für den Gegenstand, entsprechen, wenn es das einzige, was in dem Array ist:

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

Es ist einfacher, mit x Abstand lesen aktiviert:

,\s*{\s*"id":"440"[^}]*} | 
    {\s*"id":"440"[^}]*}\s*,| 
    {\s*"id":"440"[^}]*} 
+0

nett, aber das wird nicht das Komma nach oder vor dem Element entfernen, was zu einem ungültigen Array führt –

+0

@JulieRokk Ich habe eine Version hinzugefügt, die mit Kommas übereinstimmt. – Laurel

1

Schleife durch JSON Beispiel der Verwendung von ID, in Ihrem Fall müssen Sie nicht unset() verwenden.

$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

+0

ich tue es schon so, tnx trotzdem ... –

+0

'({\ s * \" id \ ": \" 440 \ "[^}] *) ((\ s *},) | (\ s * } \ s *]) | (\ s *} \ s *} \ s *]) | (\ s *} \ s *},)) https://regex101.com/r/xX5nD8/1, https : //regex101.com/r/xX5nD8/2 Ich bin kein Regex-Experte, aber das macht die Arbeit :) Testen Sie es weiter, wenn Sie möchten, indem Sie das interne Ihres json ändern. Es sollte mit der ID abgefragt werden, auch wenn das Element zuletzt in json (']' anstelle von ',') ist, oder versuchen, ein letztes Unterelement wie '" "zu haben: {}' statt '" ... " : "" ' –

1

Hätten Sie etwas dagegen diese Funktion, um zu versuchen und sehen, ob es den Trick für Sie tut?

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


     // 

Ich hoffe, dass es in ein wenig hilft .... ;-)

+0

Tnx, leider funktioniert das nicht, wenn ich das letzte Element in der JSON-Zeichenfolge auswähle, was zu einem ungültigen Array führt –