Help us understand the problem. What is going on with this article?

文字列から、JSONオブジェクトを正規表現で抽出

こんにちは。

文字列から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回以上マッチ。

?

  • 最短マッチ。デフォルトでは最長マッチなので、全てのオブジェクトが一つの要素として取れてしまう。

参考

naogify
GISや人工衛星のデータを触ってます。本職はWebのエンジニアです。/OpenStreetMap/Osumium/Tellus/
https://naoki-is.me/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away