PHP の標準関数を目的別に調べることができる辞典

ホーム > PHP 標準関数逆引き辞典 > 正規表現 > Perl 互換の正規表現にマッチした部分を置き換える

PHP 標準関数逆引き辞典

:: reverse dictionary ::

正規表現

※ソースファイルについて


Perl 互換の正規表現にマッチした部分を置き換える

Perl 互換の正規表現にマッチした部分を置き換えるには、preg_replace 関数を使います。

$data = "AB1234FG AB56789FG";

// 数字の部分をアルファベットに置き換え
$pattern = "/[0-9]+/";
$replace = "CDE";
$result = preg_replace($pattern, $replace, $data);

ソースファイル

$result"ABCDEFG ABCDEFG" になります。

▼ 関数

mixed preg_replace(mixed p, mixed r, mixed s)
mixed preg_replace(mixed p, mixed r, mixed s, int n)

正規表現のパターン ps を検索し、マッチした部分を r に置き換えます。
通常これらの引数には、文字列を指定します。

パターン p にマッチする部分が見つかった場合、その部分の次の文字から検索を続けます。 s の最後に到達すると、マッチした部分を r に置き換えた値を返します。

マッチする部分が見つからなかった場合は、s をそのまま返します。


置き換え回数 n は、PHP 4.0.2 以降で利用できます。
マッチした部分を n 回だけ置き換えます。

$data = "AB1234FG AB56789FG";

// 数字の部分をアルファベットに置き換え
$pattern = "/[0-9]+/";
$replace = "CDE";
$result = preg_replace($pattern, $replace, $data, 1);

ソースファイル

$result"ABCDEFG AB56789FG" になります。
(最初にマッチした部分のみを置き換え)


正規表現のパターンは、Perl と同じ形式で指定できます。

●引数

p … 正規表現のパターン
r … 置き換える値
s … 検索対象の値
n … 置き換え回数

●戻り値

・パターン p にマッチする部分が見つかった … 置き換えた値
・パターン p にマッチする部分が見つからなかった … s

●バージョン

PHP3(3.0.9以降)、PHP4 、PHP5

●補足1

置き換える値 r において、後方参照を行うことができます。
(※後方参照 … 置き換える値からマッチした部分を参照すること)

参照は、「 \\n 」または「 \$n 」の形式で記述します。

\$n 」の形式は、PHP 4.0.4 以降で利用できます。
新しいバージョンの場合は、こちらを利用します。

n には、「 099 」の値を指定できます。
0 はパターン全体、1 以降は括弧の部分を参照します。

  • \$0 … パターン全体
  • \$1 … 1 番目の括弧
  • \$2 … 2 番目の括弧
  • \$3 … 3 番目の括弧
  •  :

後方参照は主に、データの並びや書式を変更する場合に利用されます。

$ymd = "11/22/2005 12/03/2005";

// 「mm/dd/yyyy」を「yyyy年mm月dd日」に変更
// yyyy:年4桁  mm:月2桁  dd:日2桁
$pattern = "/([0-9]+)\/([0-9]+)\/([0-9]+)/";
$replace = "\$3年\$1月\$2日";
$result = preg_replace($pattern, $replace, $ymd);

ソースファイル

$result"2005年11月22日 2005年12月03日" になります。
(日付の並びと書式を変更)

●補足2

prs の3つの引数には、配列を指定できます。

配列を指定した場合の動作は、次のとおりです。
(配列以外の値は文字列に仮定)

(1) p=文字列、r=文字列、s=配列

配列 s のすべての要素に対して置き換えを行います。
戻り値は配列になります。

p で要素内を検索し、マッチした部分を r に置き換えます。

(2) p=文字列、r=配列、s=文字列

置き換えに失敗し、警告メッセージを表示します。

Warning: preg_replace(): Parameter mismatch, pattern is a string
while replacement in an array.

(訳)パターンが文字列、置き換える値が配列の場合は、
    値の釣り合いが取れません。

(3) p=文字列、r=配列、s=配列

置き換えに失敗し、警告メッセージを表示します。
メッセージは (2) と同じです。

(4) p=配列、r=文字列、s=文字列

p の要素にマッチした部分をすべて r に置き換えます。

(5) p=配列、r=文字列、s=配列

配列 s のすべての要素に対して置き換えを行います。
戻り値は配列になります。

p の要素にマッチした部分をすべて r に置き換えます。

(6) p=配列、r=配列、s=文字列

p の要素にマッチした部分を対応する r に置き換えます。

配列は連想配列として処理されます。
pr の値の対応は、キーの順序によって異なります。

普通の配列をそのまま指定すると、キーの順序が添字の順序と異なることがあるため、正常な結果にならない場合があります。

正常な置き換えを行うためには、preg_replace 関数を呼び出す前に、ksort 関数で2つの配列をソートする必要があります。

2つの配列をキーの昇順でソートすることによって、添字と同じ順序で値が対応するようになります。

  • p[0] にマッチした部分 → r[0] に置き換え
  • p[1] にマッチした部分 → r[1] に置き換え
  • p[2] にマッチした部分 → r[2] に置き換え
  • p[3] にマッチした部分 → r[3] に置き換え
  •  

p より r の要素数が少ない場合は、残りを "" (空の文字列)で置き換えます。

$patterns = array(
                  "/([0-9]+)年,([0-9]+)月/"
                , "/PHP ([0-9]+)\.([0-9]+)\.([0-9]+)/"
                , "/[,:]/"
            );

$replaces = array(
                  "\$1,\$2"
                , "PHP_\$1_\$2_\$3"
                , "/"
            );

$version = "2006年,05月:PHP 5.1.4";

ksort($patterns);
ksort($replaces);

$result = preg_replace($patterns, $replaces, $version);

ソースファイル

$result"2006/05/PHP_5_1_4" になります。

(7) p=配列、r=配列、s=配列

配列 s のすべての要素に対して置き換えを行います。
戻り値は配列になります。

p の要素にマッチした部分を対応する r に置き換えます。

配列は連想配列として処理されます。
pr の対応は (6) と同じです。

$patterns = array(
                  "/([0-9]+)年,([0-9]+)月/"
                , "/PHP ([0-9]+)\.([0-9]+)\.([0-9]+)/"
                , "/[,:]/"
            );

$replaces = array(
                  "\$1,\$2"
                , "PHP_\$1_\$2_\$3"
                , "/"
            );

$versions = array(
                  "2004年,12月:PHP 4.3.10"
                , "2006年,01月:PHP 4.4.2"
                , "2006年,05月:PHP 5.1.4"
            );

ksort($patterns);
ksort($replaces);

$results = preg_replace($patterns, $replaces, $versions);

ソースファイル

$results[0]"2004/12/PHP_4_3_10"
$results[1]"2006/01/PHP_4_4_2"
$results[2]"2006/05/PHP_5_1_4" になります。

●補足3

パターンには、e 修飾子を指定できます。 この修飾子を指定すると、置き換えた文字列が PHP コードとして実行されるようになります。

e 修飾子は、パターン p の最後に指定します。

"/パターン/e"

PHP コードは、置き換える値 r に記述します。 文字列として処理する部分は、シングルクォート( ' )またはダブルクォート( \" )で囲む必要があります。

$ymd = "2005年11月22日 2006年03月21日";

// 「yyyy年mm月dd日」を「mm/dd/yy」に変更
// yyyy:年4桁  yy:年下2桁  mm:月2桁  dd:日2桁
$pattern = "/([0-9]+)年([0-9]+)月([0-9]+)日/e";
$replace = "'\$2/\$3/'.substr('\$1', -2)";
$result = preg_replace($pattern, $replace, $ymd);

ソースファイル

$result"11/22/05 03/21/06" になります。

なお、無効な PHP コードを記述した場合は、置き換えに失敗します。
そして、次のようなエラーメッセージを表示します。

Fatal error: preg_replace(): Failed evaluating code

(訳)コードの評価に失敗しました。

注目キーワード ベスト5

  1. セキュリティ
  2. ホスティング
  3. レンタルサーバ
  4. ファイル復旧
  5. ハードディスク修復

正規表現 - regular expression -


ホーム > PHP 標準関数逆引き辞典 > 正規表現 > Perl 互換の正規表現にマッチした部分を置き換える

Copyright (C) 2005-2007 Noto Watabe. All rights reserved.
e-mail:wmh@always-pg.com