PHP - 正規表現による検索と置換

公開日:2020-12-22 更新日:2020-12-22
[PHP]

1. 概要

正規表現による検索と置換についてです。
正規表現を使わない検索では、固定の文字列を指定して検索しますが、
正規表現を使うと、パターンを指定して、そのパターンに一致した文字列を検索することができます。

例えば、エクスプローラーのファイル検索で「*.jpg」とすると、
jpg形式の画像を検索できますが、
「*」以外にもいろいろ使えるようにしたものが正規表現です。

2. 正規表現による検索

正規表現で検索するには、preg_match()、preg_match_all() を使います。
preg_match() は最初に見つかった文字列や位置を返しますが、
preg_match_all() は、見つかった全ての文字列や位置を返します。

引数1:正規表現による検索パターン
引数2:検索対象文字列
引数3:戻り値(配列)
引数4:PREG_OFFSET_CAPTURE を指定すると、見つかった位置も引数3の戻り値に入ります。
戻り値:見つかった数

preg_match() の使用例
$pattern = '/[[:alpha:]]+/'; //検索パターン(1文字以上のアルファベット)
$target = 'あいうえお abcd かきくけこ efg';
$result = preg_match($pattern, $target, $matches, PREG_OFFSET_CAPTURE) ;
var_dump($result);  // int(1)
var_dump($matches);
var_dump('見つかった文字列:' . $matches[0][0]);  // 検索パターンに一致した文字列
var_dump('見つかった位置:'   . $matches[0][1]);  // 16。バイト単位の位置が返る。マルチバイト要注意。
var_dump(mb_strpos($target,    $matches[0][0])); // 6
実行結果
int(1)
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(4) "abcd"
    [1]=>
    int(16)
  }
}
string(29) "見つかった文字列:abcd"
string(24) "見つかった位置:16"
int(6)

検索パターンに一致した文字列と見つかった位置は、3番目の引数に設定されます。
見つかった位置はバイト単位で返るため、検索対象文字列にマルチバイト文字が含まれる場合は注意してください。

preg_match_all() の使用例
実行結果が入る引数3の配列は、階層が1つ深くなります。
$pattern = '/[[:alpha:]]+/'; //検索パターン(1文字以上のアルファベット)
$target = 'あいうえお abcd かきくけこ efg';
$result = preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE) ;
var_dump($result);  // int(1)
var_dump($matches);
for ($i = 0; $i < count($matches[0]); $i++) {
    var_dump('見つかった文字列:' . $matches[0][$i][0]); // 検索パターンに一致した文字列
    var_dump('見つかった位置:' . $matches[0][$i][1]);   // 16。バイト単位の位置が返る。マルチバイト要注意。
    var_dump(mb_strpos($target, $matches[0][$i][0]));  // 6
}
実行結果
int(2)
array(1) {
  [0]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      string(4) "abcd"
      [1]=>
      int(16)
    }
    [1]=>
    array(2) {
      [0]=>
      string(3) "efg"
      [1]=>
      int(37)
    }
  }
}
string(29) "見つかった文字列:abcd"
string(24) "見つかった位置:16"
int(6)
string(28) "見つかった文字列:efg"
string(24) "見つかった位置:37"
int(17)

3. 正規表現による置換

正規表現で置換をするには、preg_replace() を使います。
$target = 'あいうえお abc かきくけこ def さしすせそ';
var_dump( preg_replace('/[[:alpha:]]+/', '*', $target) );
var_dump( preg_replace('/[[:alpha:]]/' , '*', $target) );
var_dump( preg_replace(['/a/', '/b/', '/c/'], '0',             $target) );
var_dump( preg_replace(['/a/', '/b/', '/c/'], ['1', '2', '3'], $target) );
実行結果
string(51) "あいうえお * かきくけこ * さしすせそ"
string(55) "あいうえお *** かきくけこ *** さしすせそ"
string(55) "あいうえお 000 かきくけこ def さしすせそ"
string(55) "あいうえお 123 かきくけこ def さしすせそ"