【php】preg_matchの便利な使い方

未分類
この記事は約3分で読めます。

まずは文法

preg_match(検索パターン, 検索対象文字列, 結果配列)

// よく見るのだとこんな感じ。
$pattern = '/正規表現/';
$subject = '文字列';
preg_match($pattern, $subject, $match);

ざっくりどんな機能?

1. 正規表現を用いて、文字を抽出することができる

// 郵便番号
$postal_code = '123-4567';
// 正規表現
$regex_pattern = '/^\d{3}-\d{4}$/';
preg_match($regex_pattern, $postal_code, $match);

var_dump($match);exit();
> array(1) { 
[0]=> string(8) "123-4567" 
}

2. 部分的に文字列を抽出することができる(キャプチャ機能)

// 郵便番号
$postal_code = '123-4567';
// 正規表現
$regex_pattern = '/^(\d{3})-(\d{4})$/';// ← ()で部分的に抽出したい部分を囲う
preg_match($regex_pattern, $postal_code, $match);

var_dump($match);exit();
> array(3) {
[0]=> string(8) "123-4567" 
[1]=> string(3) "123" 
[2]=> string(4) "4567" 
}

3. 結果配列のキー名を指定することができる

// 郵便番号
$postal_code = '123-4567';
// 正規表現
$regex_pattern = '/^(?P<postal_code>\d{3}-\d{4})$/';// ← ?P<キー名>をつける
preg_match($regex_pattern, $postal_code, $match);

var_dump($match);exit();
> array(5) { 
[0]=> string(8) "123-4567" 
["before"]=> string(3) "123" // ← これ
[1]=> string(3) "123" 
["after"]=> string(4) "4567" // ← これ
[2]=> string(4) "4567" 
}

以上を踏まえて、個人的に…

ケン
ケン

3番目の「結果配列のキー名を指定することができる」を使うのがいいと思ってます!

理由

  1. 値のアクセス識別子がマジックナンバー(数字での指定)になってしまい、分かりづらい。
  2. キー名を指定してあげることによって、それが何を表すのかが明確になる
    なので、明示的に以下のようにしなくても第3者にとっても分かりやすい。
// 今までの値の取り方
$postal_code = $match[0];
// キー名指定の取り方
$match['postal_code']

ただ、検索パターン中に正規表現以外の文字列?P<キー名>が入ってきて、ごちゃごちゃする印象は確かにある。

しかし、個人的にはキーが$matchに明示的に格納されるので、多少ごちゃごちゃしても許容範囲内。

以上、preg_matchの便利な使い方でした!!!

コメント