【PHP入門2021】正規表現を使って文字列を置換するpreg_replace関数

PHP

preg_replace関数の基本構文

preg_replaceは正規表現を使った文字列の置換ができる関数です。

str_replaceはあらかじめ決められた固定文字列や配列を置換できましたが、正規表現を使えば様々な条件で動的に置換が可能になります。

preg_replace ( string|array $pattern , string|array $replacement , string|array $subject , int $limit = -1 , int &$count = null )

置換元の文字列が複数あっても全て変換されます。
日本語などのマルチバイト文字列も変換可能です。

また配列の中身を置換したり、置換元と置換先のを配列で複数指定することもできます。

preg_replaceは正規表現のサブマッチ(グループ化、グループキャプチャ)が使えます。マッチした文字列自体が変数に格納されるので$0,$1,$2、${0},${1},${2}もしくは\0,\1,\2などで利用可能です。{}は省略可能ですが極力つけましょう。

正規表現自体の使い方はこちらを参考にしてみてください。

パラメータ

「ある対象文字列」の中の「文字列A」を全て「文字列B」に置換するとします

名前 初期値 説明
string|array $pattern 置換元「文字列A」にマッチする正規表現パターン(配列可)。()でグループ化可能
string|array $replacement 置換先「文字列B」の文字列(配列可)。グループ化された文字列を$0や$1,${0},${1}や\0,\1で参照可能。
string|array $subject 対象の文字列。この文字列にA→Bを適用する。(配列も可)
int $limit -1 置換条件回数。-1は無限
int&$count null 変換した個数が格納される

返り値(戻り値)

説明
string|array|null 置換後の対象文字列、配列。エラーの場合はnull

preg_replace関数の使い方

シンプルに正規表現で文字列を置換するサンプルソースコード

echo "通常の文字列を正規表現で置換する" . PHP_EOL;
$str = "私の好きな食べ物は○○○です";
echo $str . PHP_EOL;
$str = preg_replace('/[○]+/', 'ラーメン', $str);
echo $str . PHP_EOL;
通常の文字列を正規表現で置換する
私の好きな食べ物は○○○です
私の好きな食べ物はラーメンです

正規表現で文字列のホワイトスペース(空白、改行、タブ)を取り除くサンプルソースコード

\sはホワイトスペース(空白、改行、タブ)を取り除く正規表現です。

echo "正規表現で空白を取り除く" . PHP_EOL;
$str = "私は ラーメンが 好きです。\r\n私は ハンバーグも 好きです";
echo $str . PHP_EOL;
$str = preg_replace('/\s/', '', $str);
echo $str . PHP_EOL;
正規表現で空白を取り除く
私は ラーメンが 好きです。
私は ハンバーグも 好きです
私はラーメンが好きです。私はハンバーグも好きです

正規表現で配列の中身を置換するサンプルソースコード

echo "配列の中身を正規表現で置換する" . PHP_EOL;
$array = array("〇○○", "●●●", "×××");
print_r($array);
$array = preg_replace('/●/', '△', $array);
print_r($array);
配列の中身を正規表現で置換する
Array
(
    [0] => 〇○○
    [1] => ●●●
    [2] => ×××
)
Array
(
    [0] => 〇○○
    [1] => △△△
    [2] => ×××
)

正規表現のサブマッチ(グループ化、グループキャプチャ)を利用して置換するサンプルソースコード

正規表現にマッチした文字列を変数に格納して、${0}, $1, \2などの表現で置換先に展開して使えます。
どれも数字が同じなら同じ値を取り出します。

echo "正規表現のグループ化をして文字列を置換する" . PHP_EOL;
$str = "〒150-0043 東京都渋谷区 道玄坂2-29-1 SHIBUYA109";
echo $str . PHP_EOL;
$str = preg_replace('/^〒([-0-9]+)\s+(\S+)\s+(\S+)\s+(\S+)$/', "郵便番号: \${1}\r\n住所1: \${2}\r\n住所2: \${3}\r\n建物: \${4}\r\n", $str);
echo $str . PHP_EOL;
正規表現のグループ化をして文字列を置換する
〒150-0043 東京都渋谷区 道玄坂2-29-1 SHIBUYA109
郵便番号: 150-0043
住所1: 東京都渋谷区
住所2: 道玄坂2-29-1
建物: SHIBUYA109

urlをaタグのhtmlリンクに置換する

echo "URLを<a>タグに置換する" . PHP_EOL;
$str = "このページのURLはhttps://trios.pro/?a1=A&b2=B#xyzです";
echo $str . PHP_EOL;
$str = preg_replace('|https*?\://[-_.!~*a-zA-Z0-9;/?:@&=+$,%#]+|', '<a href="${0}">${0}</a>', $str);
echo $str . PHP_EOL;
URLを<a>タグに置換する
このページのURLはhttps://trios.pro/?a1=A&b2=B#xyzです
このページのURLは<a href="https://trios.pro/?a1=A&b2=B#xyz">https://trios.pro/?a1=A&b2=B#xyz</a>です

関連する関数

str_replace

正規表現の基本

PHPの正規表現が使える関数一覧(PCRE関数)

preg_***の「preg」の名前の由来

preg_からはじまる関数はPCRE関数といい、PCREというのは正規表現の仕様の種類の一つです。PCREは「Perl Compatible Regular Expressions」の略で、perl互換の正規表現という意味です。

すなわち、preg_***関数のpregとは「PCRE + Regular + Expression」の略です。
(PHPのPだと思ったらPerlのPだったんですね・・・)

preg_match/preg_match_all

正規表現パターンによる検索全般。マッチするか確認したり、マッチした数や文字列を取得する。

preg_split

文字列を正規表現によって分割して配列に変換する。explodeのイメージ。

preg_replace

正規表現パターンにマッチした文字列を指定文字列に変換する。マッチしないと元の文字列が返る。空を返したいならpreg_filter

preg_replace_callback

preg_replaceにコールバックを渡してより柔軟な変換ができる。

preg_filter

正規表現パターンにマッチした文字列を指定文字列に変換する。マッチしないと空の文字列が返る。元の文字列を返したいならpreg_replace

preg_last_error

直近の正規表現エラーを返す

preg_quote

ある文字列を正規表現のエスケープ処理する。正規表現パターン作成時に「この文字列はこのまま扱いたいので正規表現として機能してほしくない」という場合に使う。

コメント

タイトルとURLをコピーしました