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";
echo
preg_replace($pattern, $replacement, $string);
?>

この例の出力は以下のようになります :

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";

echo
preg_replace($patterns, $replacements, $string);
?>

出力:

The bear black slow jumped over the lazy dog.

patternとreplacementでksortを行うことにより 意図した結果が得られます。

<?php

ksort
($patterns);
ksort($replacements);

echo
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. 複数の値を置換する

<?php
$patterns
= array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
                   
"/^\s*{(\w+)}\s*=/");
$replace = array ("\\3/\\4/\\1\\2", "$\\1 =");
echo
preg_replace($patterns, $replace, "{startDate} = 1999-5-27");
?>

この例の出力は次のようになります。

$startDate = 5/27/1999

例 4. 'e' 修飾子の使用法

<?php
preg_replace
("/(<\/?)(\w+)([^>]*>)/e",
              
"'\\1'.strtoupper('\\2').'\\3'",
              
$html_body);
?>

入力テキストの全てのHTMLタグを大文字に変換します。

例 5. HTMLをテキストに変換する

<?php
// $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);
?>

例 6. 空白を削除

この例は、文字列から余分な空白を取り除きます。

<?php
$str
= 'foo   o';
$str = preg_replace('/\s\s+/', ' ', $str);

// This will be 'foo o' now
echo $str;
?>

注意: パラメータlimitはPHP 4.0.1pl2で追加されました。

preg_match(), preg_match_all(), preg_split()も参照ください。