【PHP】正規表現で文字列を置換する関数preg_replace()

PHPで、正規表現で条件を指定して文字列の置換をしたい場合、
PHPには、preg_replace()という関数が準備されています。

preg_replace(引数1, 引数2, 引数3, 引数4(省略可))
  • 引数1…検索するパターン。正規表現で指定する。
  • 引数2…置換後のテキストを指定する。
  • 引数3…置換前の元テキスト
  • 引数4…置換を行う最大回数(省略可)

preg_replace()で文字列を置換してみる

まずは、試しにpreg_replace()を使って文字列を置換してみる。

文字列「進撃の巨乳」を「進撃の巨人」に修正したい為、
「巨乳」→「巨人」に置換してみる。

// 変数代入
$string = '進撃の巨乳';
$pattern = '/巨乳/';
$replacement = '巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:進撃の巨乳
  • ②置換後:進撃の巨人

preg_replace()は指定文字列すべてが対象

引数4で置換を行う回数を指定しない限りは、
全ての指定文字列が置換の対象となります。

$string = '巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。';
$pattern = '/巨乳/';
$replacement = '巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。
  • ②置換後:巨人好きな俺の彼女も、巨人な彼女の巨人の友達も「進撃の巨人」が好き。

preg_replace() 正規表現で置換文字列の条件を指定

preg_replace()は指定文字列すべてが対象となってしまう為、
特定の文字列のみ置換の対象としたい場合は、正規表現で条件を指定します。

例えば、”巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。”
という文字列のうち、行の最初の「巨乳」のみを「巨人」に変更したい場合の例。

“行の最初に一致する文字列”という条件指定’^'を使います。

例えば今回の文字列の”行の最初に一致する文字列”を指定したい場合は、
‘/^巨乳/’と記述します。

$string = '巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。';
$pattern = '/^巨乳/';
$replacement = '巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。
  • ②置換後:巨人好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。

preg_replace()は正規表現で(○○~始まる)置換文字列を指定

たくさんの文字列”巨乳”がある中から、
“進撃の巨乳”のみ”進撃の巨人”に置換したい場合の例。

単純に”進撃の巨乳”→”進撃の巨人”に置換してもよいのですが、それでは面白くないので、
preg_replace()で準備されている特殊機能を使ってみます。

preg_replace()の引数2では$n形式で()内の文字列をサブパターンとして持つ事ができます。
1つ目の()は$1、2つ目の()は$2といった感じです。

$string = '巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。進撃の巨乳も巨乳もだぁいすき!';
$pattern = '/(進撃の)巨乳/';
$replacement = '$1巨人';

// ①置換前
echo $string;

// ②置換後
echo preg_replace($pattern, $replacement, $string);
  • ①置換前:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨乳」が好き。進撃の巨乳も巨乳もだぁいすき!
  • ②置換後:巨乳好きな俺の彼女も、巨乳な彼女の巨乳の友達も「進撃の巨人」が好き。進撃の巨人も巨乳もだぁいすき!

【正規表現】Dreamweaverで検索・置換する【電話番号編】

【準備】

Dreamweaverで、
①ctrl+Fで「検索および置換」ウィンドウを開く。

②「正規表現を使用」にチェックを入れる。

dw_chikan

【電話番号を検索】

■電話番号の桁数にこだわらない検索

0[\d]+-[\d]+-[\d]

(.*)は限りなく連続した全ての文字が判定されますが
[\w]や[\d]というふうに書くと、
数字だけ、英数字だけといった条件指定が可能になります。

「\w」……下線を含む半角英数字を表します。([A-Za-z0-9_]と同じ)
「\d」……半角数字の0~9を表します。([0-9]と同じ)
「+」……直前の1文字の1回以上の繰り返しを表します。

■電話番号の桁数を固定した検索

\d{3}-\d{4}-\d{4}

「3桁-4桁-4桁」の「数字のみ」検索として絞り込む

「\d」……半角数字の0~9を表します。[0-9] と同じ
「\d{n}」……「\d」(半角数字)がn個続く事を表します。

■電話番号の桁数を指定した検索

\d{2,4}-\d{2,4}-\d{4}

「2~4桁-2~4桁-4桁」の「数字のみ」検索として絞り込む

「\d」……半角数字の0~9を表します。[0-9] と同じ
「\d{n}」……「\d」(半角数字)がn個続く事を表します。
「\d{2,4}」……「\d」(半角数字)が2~4個続く事を表します。

■フリーダイヤル用検索

0120-\d+-\d+

【PHP】preg_match関数で正規表現を使って複数の値を配列に入れる

preg_match関数で正規表現を使って複数の値を配列に入れます。

今回はA○B48の篠田麻○子さんのプロフィールを配列に入れてみます。

<?php
	// 元の文字列
	$size = "168/87(E).57.85";

	// preg_match関数でマッチした値を配列に入れる
	preg_match("/([0-9]*)\/([0-9]*)\(([A-Za-z])\)\.([0-9]*)\.([0-9]*)/", $size, $match);

	// 配列の中身を確認
	print_r($match);
?>

【補足】
配列に入れたい(抜き出したい)部分を()で囲みます。
[0-9]は0から9までの数字全部という意味です。
[0-9]*のさいごの”*”は直前の文字が1つ以上連続するという意味です。
[A-Za-z]はaからz、AからZのアルファベット全部という意味です。

【出力結果】

Array ( [0] => 168/87(E).57.85 [1] => 168 [2] => 87 [3] => E [4] => 57 [5] => 85 ) 

【正規表現】Dreamweaverで改行を含むコードの一括置換

Adobe Dreamweaverの正規表現モードで改行を含むコードを一括置換してみる。

例えば、ファイル内のすべてのliタグを検索したい場合は、
<liと</li>に囲まれた部分を検索すればいいので、
Ctrl+Fで[検索および置換]ウィンドウの[オプション]欄の[正規表現]を使用にチェックを入れて

<li.*</li>

の文字列で検索することができます。

しかし、” .* “は一行しか検索できない為、
改行などを含む文字列の検索は出来ません。

liタグは1行な事が多いですが、ulタグだとそうはいきません。
<ulと</ul>に囲まれた複数行の部分を検索する場合は、
改行も想定して(.*\r\n)すべての文字列のほかに改行も検索条件にいれます。

<ul(.*\r\n){0,10000}.*?</ul>

とすれば改行も想定した検索ができます。

{0,10000}は検索がループに陥らない為の記述です。