関数・クラス解説

preg_replace

version:PHP 4, PHP 5, PHP 7 (公式)

正規表現検索および置換を行う

公式リファレンス

書式

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

説明

subject に関して pattern を用いて検索を行い、 replacement に置換します。

パラメータ

pattern
検索を行うパターン。文字列もしくは配列とすることができます。 PCRE 修飾子 も使えます。
replacement
置換を行う文字列もしくは文字列の配列。 この引数が文字列で、pattern 引数が配列の場合、 すべてのパターンがこの文字列に置換されます。 pattern および replacement のいずれもが配列の場合、各 pattern は 対応する replacement に置換されます。 もし、replacement 配列の要素の数が pattern 配列よりも少ない場合は、余った pattern は 空文字に置換されます。 replacement では、 \n 形式または $n 形式で参照を指定することができます。 後者の形式の方が好ましい形式です。各参照は、n 番目のキャプチャ用サブパターンにマッチしたテキストにより置換されます。 n は 0 から 99 までとすることができ、 \0 または $0 は パターン全体にマッチするテキストを参照します。キャプチャ用サブパターンの番号 については、その左括弧が左から右に(1から)カウントされます。 string に含まれるバックスラッシュリテラルは、エスケープが必須であることに注意して下さい。 後方参照の直後に他の数字が続くような置換 (replacement) パターンを 使用する場合(すなわち、マッチしたパターンの直後に数字リテラルを置く 場合)、後方参照を行うために通常の \1 表記を 使用することができません。例えば、\11 は、 後方参照 \1 の後にリテラル 1 が続くのか、後方参照 \11 で その後には何も続かないのかが不明のため、 preg_replace() を混乱させる可能性があります。 この場合、解決策は、${1}1 を使用することです。 こうすることで、1 はリテラルとなり、後方参照 $1 を明確に作成できます。 非推奨の e 修飾子を使用する際に、 この関数は後方参照を置換する文字列のうちの特定の文字 (具体的には '、"、 \ および NULL) をエスケープします。 これは、後方参照をシングルクォートやダブルクォートを共用した場合 (たとえば 'strlen(\'$1\')+strlen("$2")') に構文エラーが発生しないようにするためのものです。 PHP の 文字列構文 を意識し、 文字列がどのように解釈されるのかを正確に知っておくようにしましょう。
subject
検索・置換対象となる文字列もしくは文字列の配列 subject が配列の場合、検索と置換は subject の各要素に対して行われ、返り値も配列となります。
limit
subject 文字列において、各パターンによる 置換を行う最大回数。デフォルトは -1 (制限無し)。
count
この引数が指定されると、置換回数が渡されます。

返値

preg_replace() は、 subject 引数が配列の場合は配列を、 その他の場合は文字列を返します。 パターンがマッチした場合、〔置換が行われた〕新しい subject を返します。マッチしなかった場合、subject をそのまま返します。エラーが発生した場合、NULL を返します。

エラー

PHP 5.5.0 以降で "\e" 修飾子を使うと、 E_DEPRECATED レベルのエラーが発生します。 PHP 7.0.0 以降で "\e" 修飾子を使うと、 E_WARNING レベルのエラーが発生します。

注意

注意: pattern および replacement を使用する際、配列の並び順に処理されます。添字は整数であっても、 その並びは値の小さい順になっているとは限りません。 ですから、配列の添字を使って、どの pattern が、どの replacement に置換されるかを指定しようとする場合は、 preg_replace() をコールする前に、各配列に対し ksort() を実行しておくべきです。

サンプル

例1 数字リテラルが後に続く後方参照

$string = 'April 15, 2003'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = '${1}1,$3'; echo preg_replace($pattern, $replacement, $string);

上の例の出力は以下となります。

April1,2003

例2 添字配列の使用

$string = 'The quick brown fox jumps over the lazy dog.'; $patterns = array(); $patterns[0] = '/quick/'; $patterns[1] = '/brown/'; $patterns[2] = '/fox/'; $replacements = array(); $replacements[2] = 'bear'; $replacements[1] = 'black'; $replacements[0] = 'slow'; echo preg_replace($patterns, $replacements, $string);

上の例の出力は以下となります。

The bear black slow jumps over the lazy dog.

pattern と replacement を ksort すると、所望のものが得られます。

ksort($patterns); ksort($replacements); echo preg_replace($patterns, $replacements, $string);

上の例の出力は以下となります。

The slow black bear jumps over the lazy dog.

例3 複数値の置換

$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 空白の削除

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

$str = 'foo   o'; $str = preg_replace('/\s\s+/', ' ', $str); // This will be 'foo o' now echo $str;

例5 count 引数の使用

$count = 0; echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count); echo $count; //3

上の例の出力は以下となります。

xp***to 3

参考

  • PCRE のパターン
  • preg_quote() - 正規表現文字をクオートする
  • preg_filter() - 正規表現による検索と置換を行う
  • preg_match() - 正規表現によるマッチングを行う
  • preg_replace_callback() - 正規表現検索を行い、コールバック関数を使用して置換を行う
  • preg_split() - 正規表現で文字列を分割する
  • preg_last_error() - 直近の PCRE 正規表現処理のエラーコードを返す
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール