preg_replace
(PHP 3>= 3.0.9, PHP 4 , PHP 5)
preg_replace -- 正規表現検索および置換を行う
説明
mixed
preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
subjectに関して
patternを用いて検索を行い、
replacementに置換します。
limitを指定した場合、
limit
回のマッチまで置換が行なわれます。limitが
省略されるか -1 の場合、マッチするものは全て置換されます。
replacementでは、
\\n形式または
(PHP 4.0.4 以降) $n
形式で参照を指定することができます。後者の形式の方が好ましい形式
です。各参照は、n番目の括弧で括られた
パターンにマッチしたテキストにより置換されます。
nは0から99までとすることができ、
\\0 または $0 はパターン全
体にマッチするテキストを参照します。マッチしたサブパターンの番号
を得るために左括弧は(1から始まって)左から右に番号がふられます。
注意:
後方参照の直後に他の数字が続くような置換(replacement)パターンを使
用する場合(すなわち、マッチしたパターンの直後に数字リテラルを置く
場合)、後方参照を行うために通常の\\1表記を使用
することができません。例えば、\\11は、
後方参照 \\1 の後にリテラル
1が続くのか、後方参照\\11で
その後には何も続かないのかが不明のため、
preg_replace() を混乱させる可能性があります。
この場合、解決策は、\${1}1を使用することです。
これにより、1をリテラルとしつつ、後方参照
$1を区別して作成できます。
例 1. 数字リテラルが後に続く後方参照を使用する
<?php $string = "April 15, 2003"; $pattern = "/(\w+) (\d+), (\d+)/i"; $replacement = "\${1}1,\$3"; print preg_replace($pattern, $replacement, $string);
/* Output ======
April1,2003
*/ ?>
|
|
マッチした場合、新しいsubjectが返されます。
マッチしなかった場合には、subject は、変更
されずに返されます。
preg_replace()に渡す
(limit以外の)全てのパラメータは配列とする
ことができます。
注意:
patternおよび
replacementに配列を使用した場合、
そのキーが配列に現れる順番に処理されます。
この順番が数値添字の順番と同じとなる必然性はありません。
特定のpatternが特定の
replacementで置換されることを指定するため
に添字を使用する場合、preg_replace()をコールす
る前に各配列に関してksort()を実行する必要があ
ります。
例 2. preg_replace()で添字配列を使用
<?php $string = "The quick brown fox jumped over the lazy dog.";
$patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/";
$replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow";
print preg_replace($patterns, $replacements, $string);
/* 出力 ======
The bear black slow jumped over the lazy dog.
*/
/* patternとreplacementでksortを行うことにより 意図した結果が得られます。 */
ksort($patterns); ksort($replacements);
print preg_replace($patterns, $replacements, $string);
/* 出力 ======
The slow black bear jumped over the lazy dog.
*/
?>
|
|
subjectが配列の場合、検索及び置換は
subjectの各エントリ毎に行われ、
返り値も配列として返されます。
patternおよびreplacement
が配列の場合、
preg_replace()は各配列からの値を用いて
subjectに関する検索および置換を行います。
replacementの値が
patternよりも少ない場合、残りの置換用文字列
に関して空の文字列が使用されます。
パターンpatternが配列で
replacementが文字列の場合、この置換文字列
は patternの各値毎に使用されます。
しかし、逆の場合は意味がありません。
/e修飾子は、
preg_replace()が
replacementパラメータを適当な置換を
行った後、PHP コードとして処理するようにします。
ヒント:
replacement が有効なPHPコード文字列から
構成されるようにしてください。そうでない場合、
preg_replace() のある行でPHP は構文エラーを発
生します。
例 3. 複数の値を置換する
$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/"); $replace = array ("\\3/\\4/\\1\\2", "$\\1 ="); print preg_replace ($patterns, $replace, "{startDate} = 1999-5-27");
|
|
この例の出力は次のようになります。
例 4. /e 修飾子の使用法
preg_replace ("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", $html_body);
|
入力テキストの全てのHTMLタグを大文字に変換します。
|
例 5. HTMLをテキストに変換する
// $document には、HTMLドキュメントが含まれている必要があります。 // このドキュメントのHTMLタグおよびjavascriptの部分と空白文字を // 削除します。また、いくつかのHTMLエンティティを等価なテキストに // 変換します。 $search = array ("'<script[^>]*?>.*?</script>'si", // javascriptを削除 "'<[\/\!]*?[^<>]*?>'si", // htmlタグを削除 "'([\r\n])[\s]+'", // 空白文字を削除 "'&(quot|#34);'i", // htmlエンティティを置換 "'&(amp|#38);'i", "'&(lt|#60);'i", "'&(gt|#62);'i", "'&(nbsp|#160);'i", "'&(iexcl|#161);'i", "'&(cent|#162);'i", "'&(pound|#163);'i", "'&(copy|#169);'i", "'&#(\d+);'e"); // phpとして評価
$replace = array ("", "", "\\1", "\"", "&", "<", ">", " ", chr(161), chr(162), chr(163), chr(169), "chr(\\1)");
$text = preg_replace ($search, $replace, $document);
|
|
注意:
パラメータlimitはPHP 4.0.1pl2で追加されま
した。
preg_match(),
preg_match_all(),
preg_split()も参照下さい。