Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
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()』はエスケープされた文字列を返します。
サンプルコード
<?php
// 基本的なパターンマッチング
if (preg_match("/php/i", "PHP is great")) {
echo "マッチしました。"; // 大文字小文字を無視してマッチします。
}
// マッチした部分を取得します。
preg_match("/(\d{4})-(\d{2})-(\d{2})/", "登録日: 2025-04-15", $matches);
echo $matches[0]; // 全体のマッチで『2025-04-15』と出力されます。
echo $matches[1]; // 1番目のグループで『2025』と出力されます。
echo $matches[2]; // 2番目のグループで『04』と出力されます。
echo $matches[3]; // 3番目のグループで『15』と出力されます。
// 名前付きキャプチャグループを使用します。
$pattern = "/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})/";
preg_match($pattern, "2025-04-15", $matches);
echo $matches["year"]; // 『2025』と出力されます。
echo $matches["month"]; // 『04』と出力されます。
// メールアドレスの形式を検証します。
$email = "user@example.com";
if (preg_match("/^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/", $email)) {
echo "有効なメールアドレスです。";
}
// 日本語を含むパターンマッチング。u フラグでUTF-8として処理します。
preg_match("/[ぁ-ん]+/u", "Hello こんにちは World", $matches);
echo $matches[0]; // 『こんにちは』と出力されます。
// 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 . "件見つかりました。"; // 『3件見つかりました。』と出力されます。
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; // 『100\$ \(税込\)』と出力されます。特殊文字がエスケープされています。
// エスケープした文字列を安全にパターンに埋め込みます。
$search = "C++";
$pattern = "/" . preg_quote($search, "/") . "/";
if (preg_match($pattern, "言語: C++, Java, PHP")) {
echo "『" . $search . "』が見つかりました。";
}
概要
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()』で行います。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。