こんにちは。
文字列からJSONオブジェクトを正規表現で抽出したくなった事ってありませんか?
例えばAPIから返ってきたレスポンスが、下のような文字列だったとします。
string(102) "[
{
"id": 230,
"content": "ブレイクアウトルーム",
},
{
"id": 100,
"content": "zoom",
}
]"
JSON形式の部分だけ抽出して配列に代入できたら、操作が楽ですよね。
やってみると意外と大変だったので、備忘録として書いておきます。
サンプルコード
$pattern = '/\{[\s\S]*?\}/';
preg_match_all($pattern, $response, $matches );
抽出結果
array(1) {
[0]=>
array(2) {
[0]=>
string(59) "{
"word_id": 230,
"surface_form": "ブレイクアウトルーム",
}"
[1]=>
string(48) "{
"word_id": 100,
"content": "zoom",
}"
}
}
各配列の要素は、文字列ですがPHPでは、json_decode($matches[0][0], true)
を使うと、連想配列に変換できます。
正規表現
ポイントは、正規表現の書き方です。
'/\{[\s\S]*?\}/'
説明
[\s\S]
改行とそれ以外の文字にマッチ。
- \s :空白、タブ、フォーム フィードなどの任意の空白文字
- \S:空白文字以外の任意の文字
*
直前の文字に0回以上マッチ。
?
- 最短マッチ。デフォルトでは最長マッチなので、全てのオブジェクトが一つの要素として取れてしまう。