PHPでの正規表現の使用

正規表現の動作について復習が必要な場合は、まずインタラクティブチュートリアルをご覧ください!

PHPは、ほとんどすべてのPHPインストールで有効になっているPCRE(Perl Compatible Regular Expressions)ライブラリを使用して正規表現をサポートしています。以下のいずれかのメソッドを呼び出す場合、PHPでは各パターンが同じデリミタで始まり終わる必要があります。これは、通常の文字列との区別のためであり、最も一般的なデリミタはスラッシュ文字です。

たとえば、正規表現"\w+"は、1つ以上の英数字文字に一致する式を表すPHPでは"/\w+/"と書きます。

文字列の一致

PHPでは、preg_match()関数を使用して、正規表現が特定の文字列と一致するかどうかをテストできます。この関数は最初のマッチングの後で停止することに注意してください。そのため、データの抽出よりも正規表現のテストに最適です。

メソッド
$has_matches = preg_match($pattern, $input_str, $matches_out);
// 日付文字列に一致する正規表現を使用してみましょう。// 正規表現が一致するかどうかをテストしているので、出力は無視します。$regex = "/[a-zA-Z]+ \d+/"; if (preg_match($regex, "June 24")) { // 確かに、式 "[a-zA-Z]+ \d+" は日付文字列と一致します echo "一致が見つかりました!"; } else { // preg_match() が false を返す場合、正規表現は // 文字列と一致しません echo "正規表現パターンは一致しません。:("; }

キャプチャグループ

上記のpreg_match()関数とは異なり、preg_match_all()関数を使用して、入力文字列のグローバル検索を実行できます。preg_match_all()がtrueを返す場合、$matches_outで指定された配列を反復処理できます。

メソッド
$has_matches = preg_match_all($pattern, $input_str, $matches_out);
// 多くの日付を含む文字列で月の曜日を抽出する正規表現を書いてみましょう// $pattern = "/[a-zA-Z]+ (\d+)/"; $input_str = "June 24, August 13, and December 30"; if (preg_match_all($pattern, $input_str, $matches_out)) { // $matches_out は、正規表現でキャプチャするグループの数 N に対して N+1 のサイズを持つ配列になり、+1 は一致する部分文字列用です。 // これは、1つのグループしかキャプチャしていないため "2" を出力します echo count($matches_out); // さらに、$matches_out の各値は、入力内の正規表現の一致数 M に対して M のサイズの別の配列です。 // これは入力文字列の3つの日付に対して "3" を出力します echo count($matches_out[0]); // $matches_out[0] は、入力文字列から一致した文字列の配列です。 // これは配列 ("June 24", "August 13", "December 30") を出力します print_r($matches_out[0]); // $matches_out[1]、$matches_out[2] などは、正規表現パターンと同じ順序でキャプチャされたデータで埋められた配列です。 // これは配列 ("24", "13", "30") を出力します print_r($matches_out[1]); }

文字列の検索と置換

たとえば、古いメールドメインをすべて新しいドメインに置き換えたり、テキストの順序を入れ替えたりする場合など、正規表現を使用して文字列を検索して置換することが便利な場合があります。preg_replace()関数を使用すると、これを行うことができます。

メソッド
$replaced_str = preg_replace($pattern, $partial_replacement_str, $input_str);
// 日付文字列で曜日と月の順序を入れ替えてみましょう。// インデックス(つまり、$1と$2)によって2つのグループを直接参照できることに注意してください。$regex = "/([a-zA-Z]+) (\d+)/"; $new_string = preg_replace($regex, "$2 of $1", "June 24"); // 返される文字列は、正規表現が一致しない場合は同じ入力文字列、または変換された文字列です。 // これは "24 of June" を出力します echo $new_string;

リンク

PHPでの正規表現の使用に関する詳細については、次のリンクをご覧ください。