preg_match() / preg_match_all()
| 対応: | PHP 4(2000) |
|---|
正規表現を使って文字列のパターンマッチングを行います。特定のパターンに一致するかの判定や、一致した部分の抽出ができます。
構文
// パターンに最初にマッチした部分を取得します preg_match($pattern, $subject, $matches, $flags, $offset); // パターンにマッチする全ての部分を取得します preg_match_all($pattern, $subject, $matches, $flags, $offset); // 正規表現のメタ文字をエスケープします preg_quote($str, $delimiter);
関数一覧
| 関数 | 概要 |
|---|---|
| preg_match($pattern, $subject, &$matches) | 正規表現パターンが文字列にマッチするか判定します。最初の一致のみを取得し、マッチ結果は第3引数の配列に格納されます。 |
| preg_match_all($pattern, $subject, &$matches) | 正規表現パターンにマッチする全ての部分を取得します。マッチした回数を返します。 |
| preg_quote($str, $delimiter) | 正規表現の特殊文字をエスケープした文字列を返します。ユーザー入力を正規表現パターンに埋め込む際に使用します。 |
戻り値
『preg_match()』はマッチした場合に『1』、マッチしなかった場合に『0』、エラー時に『false』を返します。『preg_match_all()』はマッチした回数を返します。『preg_quote()』はエスケープされた文字列を返します。
サンプルコード
正規表現のパターンの読み方:『^』は先頭、『$』は末尾、『[0-9]』は数字1文字、『{3}』は直前の文字が3回繰り返し、を意味します。
sample_preg_match.php
<?php
// 基本的なパターンマッチング
if (preg_match("/php/i", "PHP is great")) {
echo "マッチしました。\n"; // 大文字小文字を無視してマッチします
}
// マッチした部分を取得します
preg_match("/(\d{4})-(\d{2})-(\d{2})/", "登録日: 2025-04-15", $matches);
echo $matches[0] . "\n";
echo $matches[1] . "\n";
echo $matches[2] . "\n";
echo $matches[3] . "\n";
// 名前付きキャプチャグループを使用します
$pattern = "/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})/";
preg_match($pattern, "2025-04-15", $matches);
echo $matches["year"] . "\n";
echo $matches["month"] . "\n";
// メールアドレスの形式を検証します
$email = "user@wp-p.info";
if (preg_match("/^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/", $email)) {
echo "有効なメールアドレスです。\n";
}
// 日本語を含むパターンマッチング。u フラグでUTF-8として処理します
preg_match("/[ァ-ン]+/u", "綾波レイ Ayanami Rei はパイロットです", $matches);
echo $matches[0] . "\n";
// preg_match_all() で全てのマッチを取得します
$html = '<img src="photo1.jpg"><img src="photo2.png"><img src="photo3.gif">';
$count = preg_match_all('/src="([^"]+)"/', $html, $matches);
echo $count . "件見つかりました。\n";
print_r($matches[1]); // 『["photo1.jpg", "photo2.png", "photo3.gif"]』が出力されます
// 電話番号を全て抽出する実用例
$text = "連絡先: 03-1234-5678 または 090-9876-5432 まで";
preg_match_all("/\d{2,4}-\d{2,4}-\d{4}/", $text, $matches);
foreach ($matches[0] as $phone) {
echo $phone . "\n"; // マッチした電話番号が出力されます
}
// preg_quote() でユーザー入力をエスケープします
$user_input = "100$ (税込)";
$escaped = preg_quote($user_input, "/");
echo $escaped . "\n"; // 『100\$ \(税込\)』と出力されます。特殊文字がエスケープされています
// エスケープした文字列を安全にパターンに埋め込みます
$search = "C++";
$pattern = "/" . preg_quote($search, "/") . "/";
if (preg_match($pattern, "言語: C++, Java, PHP")) {
echo "『" . $search . "』が見つかりました。\n";
}
実行すると次のように出力されます。
php sample_preg_match.php
マッチしました。
2025-04-15
2025
04
15
2025
04
有効なメールアドレスです。
レイ
3件見つかりました。
Array
(
[0] => photo1.jpg
[1] => photo2.png
[2] => photo3.gif
)
03-1234-5678
090-9876-5432
100\$ \(税込\)
『C++』が見つかりました。
概要
PHPの正規表現関数はPCRE(Perl Compatible Regular Expressions)ライブラリに基づいています。パターンは『/パターン/修飾子』の形式で指定し、修飾子には大文字小文字を無視する『i』、マルチラインモードの『m』、UTF-8モードの『u』などがあります。
『preg_match()』は最初のマッチだけを返すのに対し、『preg_match_all()』はすべてのマッチを返します。単にマッチするかどうかの判定だけが必要な場合は、『preg_match()』の戻り値を直接 if 文の条件に使えます。第3引数の『$matches』が不要であれば省略も可能です。
日本語を含む文字列を正規表現で処理する場合は、パターンの末尾に『u』修飾子を付けてUTF-8モードを有効にしてください。これがないと、マルチバイト文字が正しく処理されません。ユーザー入力を正規表現パターンに含める場合は『preg_quote()』でエスケープし、インジェクション攻撃を防いでください。正規表現による置換と分割は『preg_replace() / preg_split()』で行います。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。