2016-12-30 10 views
-1

JSONレスポンスがあり、PHPの一貫性のためにハイフン( - )のみをアンダースコア(_)に置き換えようとしています。 preg_replace。PHP正規表現の末尾にコロンがある場合、ハイフンをハイフンで置換する

例;

[ 
    { 
    "name": "Disable Comments", 
    "slug": "disable-comments", 
    "required": true, 
    "force-activation": true, 
    "force-deactivation": true 
    }, 
    { 
    "name": "Intuitive Custom Post Order", 
    "slug": "intuitive-custom-post-order", 
    "required": true, 
    "force-activation": false, 
    "force-deactivation": true 
    } 
] 

私はキーのみをターゲットにしようとしています。そのため、コロンで終わるものがあります。私は非常に多くのバリエーションを試しましたが、近づくことはできません。

+2

あなたが試したことを示すコードを投稿してください。より良い答えを得るのに役立ちます。 – Bek

+5

私はJSONを解析してから、JSONに直接行うのではなく、配列をループしてキーを置き換えます。 – Barmar

答えて

-1

あなたは、このいずれかを使用することができます:私は、復号化されたアレイ上ではなく、JSON自体にそれを行うだろう

echo preg_replace_callback("/\"([^\"]*)\":/", function($m){ 
    return str_replace("-", "_", $m[0]); 
}, $jsonStr); 
3

を。このような小さなJSON文字列の場合

$array = json_decode($json, true); 

foreach ($array as &$subarray) { // Use reference so we can modify the subarray in place 
    foreach ($subarray as $key => $value) { 
     $new_key = str_replace('-', '_', $key); 
     if ($new_key != $key) { 
      $subarray[$new_key] = $value; 
      unset($subarray[$key]); 
     } 
    } 
} 

$json = json_encode($array); 
+0

ありがとう、これは私が行った結末です。完璧に動作します! – newObject

+0

上記は機能しますが、キーがJSONオブジェクト/配列内に深くネストされている場合は無効です。私はそれが元の質問の範囲外であることを知っていますが、他の人がこのスレッドを見つけて多次元配列で使用しようとすると、それを指摘したかっただけです。 – newObject

+0

それは本当です。これを関数に入れてサブ配列に再帰させるのは比較的簡単です。 – Barmar

0

やり過ぎかもしれないが、あなたはまだプリプレグ-置き換えると正規表現を使用したい場合はあなたがあなたの所望の出力を達成することができます

preg_replace('/(".*)(-)(.*:\s)/','$1_$3',$json) 

$jsonあなたJSON文字列であること。

上記正規表現では、3つの異なるグループをキャプチャします。

  1. まず1 (".*)、 ハイフンまでJSON要素のキーの開始をキャッチ。
  2. 第2の(-)は、ハイフンをキャッチします。
  3. 第3のもの(.*:\s)は、 文字 の後に:の後にキーの残りの部分をキャッチします。

それらのグループが一緒に一致する場合、彼らはあなたに戻って取得し、プレースホルダ$1$2$3で各グループのマッチを使用することができます。ハイフンを置き換えたいので、置換えを、プレースホルダ$1$3で構成された文字列でハイフンで区切って作成してください。

EDIT:これは、OPで与えられた例ではなく、標準形式のjson文字列では機能しません。 更新された正規表現は次のようになります

preg_replace('/("[\w]*)(-)([\w]*"[\s]*:)/','$1_$3',$json) 

私はちょうど\w 0回以上で任意の単語文字に一致するように第一及び第三の整合グループを変更し、そして第三の整合グループにIは、任意の空白に一致する可能性を追加しましたスペースの有無にかかわらずフォーマットを一致させるには:

... "force-activation": true, "force-activation" : true, ... 
+0

改行なしの文字列で試しましたか? – Toto

+0

いいえ、私はしませんでした。しかし、私はスタンドアサイン形式のjson文字列のための解決策を編集することができます。 – Dez

+0

ありがとう、これも仕事と説明は本当に役立った! – newObject

関連する問題