【PHP】これで分かる関数! – 正規表現・サブパターンその1 –

PHP

更新履歴

更新日更新者更新内容
2021/8/21JJI・”はじめに”の段落を追加
・サンプルプログラムの実行結果に画面の画像を追加

はじめに

サンプルプログラムの中で次の記事で載せている関数を使用している場合があります。

サブパターン

サブパターンは丸括弧の()で囲ったパターンで入れ子にすることもできます。
サブパターンを使用すると次のことが可能になります。

  • 選択肢(|)の範囲指定
  • サブパターンにマッチした値の取得(キャプチャ)

サンプルプログラム1

サブパターンを1つ使用したサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】正規表現:サブパターン<br>\n";

    // サブパターン1
    $str1 = "Mike likes a big dog very very much.\n";
    $match = "/(very )+/";
    echo "検索対象文字列:" . $str1. ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo "マッチした文字列の配列<br>\n";
    echo "0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>\n"; 
    echo_array1($hits);

    // サブパターン2
    $str1 = "cat";
    $match = "/^(cat|dog)$/";
    echo "検索対象文字列:" . $str1. ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo "マッチした文字列の配列<br>\n";
    echo "0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>\n"; 
    echo_array1($hits);

    // サブパターン3
    $str1 = "dog";
    $match = "/^(cat|dog)$/";
    echo "検索対象文字列:" . $str1. ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo "マッチした文字列の配列<br>\n";
    echo "0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>\n"; 
    echo_array1($hits);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_06_11.php<br>
【PHP】正規表現:サブパターン<br>
検索対象文字列:Mike likes a big dog very very much.
:<br>
正規表現:/(very )+/:<br>
正規表現の検索結果:1:<br>
マッチした文字列の配列<br>
0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>
[0]:very very : [1]:very :<br><br>
検索対象文字列:cat:<br>
正規表現:/^(cat|dog)$/:<br>
正規表現の検索結果:1:<br>
マッチした文字列の配列<br>
0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>
[0]:cat: [1]:cat:<br><br>
検索対象文字列:dog:<br>
正規表現:/^(cat|dog)$/:<br>
正規表現の検索結果:1:<br>
マッチした文字列の配列<br>
0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>
[0]:dog: [1]:dog:<br><br>

サンプルプログラム2

サブパターンを複数使用したサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】正規表現:サブパターン<br>\n";

    // サブパターン1
    $str1 = "Mike have a black dog.\n";
    $match = "/(black|white) (dog|cat)/";
    echo "検索対象文字列:" . $str1. ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo "マッチした文字列の配列<br>\n";
    echo "0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>\n"; 
    echo_array1($hits);

    // サブパターン2
    $str1 = "Mary have a white cat.\n";
    $match = "/(black|white) (dog|cat)/";
    echo "検索対象文字列:" . $str1. ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo "マッチした文字列の配列<br>\n";
    echo "0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>\n"; 
    echo_array1($hits);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_06_12.php<br>
【PHP】正規表現:サブパターン<br>
検索対象文字列:Mike have a black dog.
:<br>
正規表現:/(black|white) (dog|cat)/:<br>
正規表現の検索結果:1:<br>
マッチした文字列の配列<br>
0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>
[0]:black dog: [1]:black: [2]:dog:<br><br>
検索対象文字列:Mary have a white cat.
:<br>
正規表現:/(black|white) (dog|cat)/:<br>
正規表現の検索結果:1:<br>
マッチした文字列の配列<br>
0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>
[0]:white cat: [1]:white: [2]:cat:<br><br>

参考

サブパターンは次のPHPマニュアルに詳しく解説しています。
もっと詳しいことを知りたい方は見てください。

PHP: サブパターン - Manual

キャプチャしないグループ

サブパターンにマッチした文字列を取得して後で使うことができます。
マッチした文字列を取得することをキャプチャといいます。
しかし、キャプチャする必要がない場合もあります。
その場合、次のようにサブパターンを書きます。

(?:subpattern)

サンプルプログラム

キャプチャしないグループのサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】正規表現:サブパターン キャプチャしないグループ<br>\n";

    // サブパターン1
    $str1 = "Mike have a black dog.\n";
    $match = "/(?:black|white) (dog|cat)/";
    echo "検索対象文字列:" . $str1. ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo "マッチした文字列の配列<br>\n";
    echo "0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>\n"; 
    echo "(?:black|white)はキャプチャしないグループのため、マッチした文字列で取得できない<br>\n"; 
    echo_array1($hits);
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_06_13.php<br>
【PHP】正規表現:サブパターン キャプチャしないグループ<br>
検索対象文字列:Mike have a black dog.
:<br>
正規表現:/(?:black|white) (dog|cat)/:<br>
正規表現の検索結果:1:<br>
マッチした文字列の配列<br>
0番目:マッチした文字列の全体、1番目以降は最初のサブパターンにマッチした部分<br>
(?:black|white)はキャプチャしないグループのため、マッチした文字列で取得できない<br>
[0]:black dog: [1]:dog:<br><br>

コメント