更新履歴
更新日 | 更新者 | 更新内容 |
---|---|---|
2021/8/21 | JJI | ・”はじめに”の段落を追加 ・サンプルプログラムの実行結果に画面の画像を追加 |
はじめに
サンプルプログラムの中で次の記事で載せている関数を使用している場合があります。
繰り返し
繰り返し(量指定子)もよく使用します。
繰り返しには次の種類があります。
貪欲な量指定子 | 貪欲でない量指定子 | 説明 |
---|---|---|
. | – | 任意の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>
検索対象文字列:<a href='test.aaa'>test link</a> this link click.:<br>
正規表現:/<.*>/:<br>
正規表現の検索結果:1:<br>
[0]:<a href='test.aaa'>test link</a>:<br>
<br>
検索対象文字列:<a href='test.aaa'>test link</a> this link click.:<br>
正規表現:/<.*?>/:<br>
正規表現の検索結果:1:<br>
[0]:<a href='test.aaa'>:<br>
<br>
コメント