:: reverse dictionary ::
※ソースファイルについて
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)
正規表現のパターン p で s を検索し、マッチした部分を 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
置き換える値 r において、後方参照を行うことができます。
(※後方参照 … 置き換える値からマッチした部分を参照すること)
参照は、「 \\n 」または「 \$n 」の形式で記述します。
「 \$n 」の形式は、PHP 4.0.4 以降で利用できます。
新しいバージョンの場合は、こちらを利用します。
n には、「 0 〜 99 」の値を指定できます。
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日" になります。
(日付の並びと書式を変更)
p 、r 、s の3つの引数には、配列を指定できます。
配列を指定した場合の動作は、次のとおりです。
(配列以外の値は文字列に仮定)
配列 s のすべての要素に対して置き換えを行います。
戻り値は配列になります。
p で要素内を検索し、マッチした部分を r に置き換えます。
置き換えに失敗し、警告メッセージを表示します。
Warning: preg_replace(): Parameter mismatch, pattern is a string
while replacement in an array.
(訳)パターンが文字列、置き換える値が配列の場合は、
値の釣り合いが取れません。
置き換えに失敗し、警告メッセージを表示します。
メッセージは (2) と同じです。
p の要素にマッチした部分をすべて r に置き換えます。
配列 s のすべての要素に対して置き換えを行います。
戻り値は配列になります。
p の要素にマッチした部分をすべて r に置き換えます。
p の要素にマッチした部分を対応する r に置き換えます。
配列は連想配列として処理されます。
p と r の値の対応は、キーの順序によって異なります。
普通の配列をそのまま指定すると、キーの順序が添字の順序と異なることがあるため、正常な結果にならない場合があります。
正常な置き換えを行うためには、preg_replace 関数を呼び出す前に、ksort 関数で2つの配列をソートする必要があります。
ksort 関数はこちら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" になります。
配列 s のすべての要素に対して置き換えを行います。
戻り値は配列になります。
p の要素にマッチした部分を対応する r に置き換えます。
配列は連想配列として処理されます。
p と r の対応は (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" になります。
パターンには、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
(訳)コードの評価に失敗しました。
Copyright (C) 2005-2007 Noto Watabe. All rights reserved.
e-mail:wmh@always-pg.com