【PHP】これで分かる関数! – 正規表現・繰り返し –

PHP

更新履歴

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

はじめに

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

繰り返し

繰り返し(量指定子)もよく使用します。
繰り返しには次の種類があります。

貪欲な量指定子貪欲でない量指定子説明
.任意の1文字、
実際には量指定子ではないが、量指定子と一緒に
使用することが多い
???0または1回にマッチ
**?0回以上の繰り返し
++?1回以上の繰り返し
{m}{m}?m回の繰り返し
{m,}{m,}?m回以上の繰り返し
{m,n}{m,n}?m回からn回の繰り返し

正規表現の量指定子は一般的に正規表現のパターンが一致する可能限りできるだけ長い範囲で一致するように処理を行います。
この可能な限りできるだけ長い範囲の処理を行うことを貪欲な処理と呼びます。

処理によっては貪欲な処理を使用せずに最初に一致したパターンで終了した場合もあります。
その場合、量指定子の前にクエスチョン(?)をつけることにより、貪欲ではない処理にすることができます。

サンプルプログラム

量指定子のサンプルプログラムです。

サンプルプログラム1

?、+、*を使用したサンプルプログラムです。

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】正規表現:繰り返し<br>\n";

    // \dの正規表現
    $str1 = "doooog";
    $match = "/do?g/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";

    $str1 = "doooog";
    $match = "/do?g/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";

    $str1 = "dg";
    $match = "/do+g/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";

    $str1 = "dg";
    $match = "/do*g/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_06_06.php<br>
【PHP】正規表現:繰り返し<br>
検索対象文字列:doooog:<br>
正規表現:/do?g/:<br>
正規表現の検索結果:0:<br>
<br>
検索対象文字列:doooog:<br>
正規表現:/do?g/:<br>
正規表現の検索結果:0:<br>
<br>
検索対象文字列:dg:<br>
正規表現:/do+g/:<br>
正規表現の検索結果:0:<br>
<br>
検索対象文字列:dg:<br>
正規表現:/do*g/:<br>
正規表現の検索結果:1:<br>
<br>

サンプルプログラム2

{m}を使用したサンプルプログラムです。

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】正規表現:繰り返し<br>\n";

    // \dの正規表現
    $str1 = "090-1234-5678";
    $match = "/\d{3}/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";

    $str1 = "090-1234-5678";
    $match = "/\d{2,4}/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";

    $str1 = "090-1234-5678";
    $match = "/\d{5,}/";
    echo "検索対象文字列:" . $str1 . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1) . ":<br>\n";
    echo "<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_06_07.php<br>
【PHP】正規表現:繰り返し<br>
検索対象文字列:090-1234-5678:<br>
正規表現:/\d{3}/:<br>
正規表現の検索結果:1:<br>
<br>
検索対象文字列:090-1234-5678:<br>
正規表現:/\d{2,4}/:<br>
正規表現の検索結果:1:<br>
<br>
検索対象文字列:090-1234-5678:<br>
正規表現:/\d{5,}/:<br>
正規表現の検索結果:0:<br>
<br>

サンプルプログラム3

貪欲ではない量指定子を使用したサンプルプログラムです。

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】正規表現:繰り返し<br>\n";

    // 強欲な量指定子の正規表現
    $str1 = "<a href='test.aaa'>test link</a> this link click.";
    $match = "/<.*>/";
    echo "検索対象文字列:" . htmlspecialchars($str1) . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo_array1_call($hits,"htmlspecialchars");

    // 強欲ではない量指定子の正規表現
    $str1 = "<a href='test.aaa'>test link</a> this link click.";
    $match = "/<.*?>/";
    echo "検索対象文字列:" . htmlspecialchars($str1) . ":<br>\n";
    echo "正規表現:" . $match . ":<br>\n";
    echo "正規表現の検索結果:" . preg_match($match, $str1, $hits) . ":<br>\n";
    echo_array1_call($hits,"htmlspecialchars");
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_06_08.php<br>
【PHP】正規表現:繰り返し<br>
検索対象文字列:&lt;a href='test.aaa'&gt;test link&lt;/a&gt; this link click.:<br>
正規表現:/<.*>/:<br>
正規表現の検索結果:1:<br>
[0]:&lt;a href='test.aaa'&gt;test link&lt;/a&gt;:<br>
<br>
検索対象文字列:&lt;a href='test.aaa'&gt;test link&lt;/a&gt; this link click.:<br>
正規表現:/<.*?>/:<br>
正規表現の検索結果:1:<br>
[0]:&lt;a href='test.aaa'&gt;:<br>
<br>

コメント