PHPの「String」操作を「preg_replace_callback」でマスター!初心者でも分かる解説とサンプルコード集


preg_replace_callback 関数は、正規表現パターンに一致する部分を、別の文字列や動的に生成された文字列に置き換える強力なツールです。この関数は、文字列操作、データクリーニング、テキスト処理などの様々なタスクに役立ちます。

本記事では、preg_replace_callback 関数の仕組みと、String 操作における具体的な使用方法を、分かりやすい例を用いて解説します。

preg_replace_callback 関数のしくみ

preg_replace_callback 関数は、3つの引数を取ります。

  1. パターン: 検索対象となる正規表現パターン
  2. コールバック関数: 一致した部分に置き換える処理を行う関数
  3. 対象文字列: 検索対象となる文字列

この関数は、パターンと一致する箇所をすべて走査し、それぞれに対してコールバック関数を呼び出します。コールバック関数は、一致した部分を表す配列を受け取り、置換後の文字列を返す必要があります。返された置換文字列が、元の文字列の該当部分に置き換えられます。

String 操作における具体的な例

以下に、preg_replace_callback 関数を使った String 操作の具体的な例をいくつか紹介します。

例1:特定の文字列を別の文字列に置き換える

この例では、対象文字列内のすべての "PHP" を "JavaScript" に置き換えます。

$subject = "私はPHPが好きです。PHPは素晴らしい言語です。";
$pattern = '/PHP/';
$callback = function($matches) {
  return 'JavaScript';
};

$result = preg_replace_callback($pattern, $callback, $subject);
echo $result; // 出力: 私はJavaScriptが好きです。JavaScriptは素晴らしい言語です。

例2:電話番号をフォーマットする

この例では、対象文字列内の電話番号をハイフン区切りの形式にフォーマットします。

$subject = "電話番号: 080-1234-5678";
$pattern = '/(\d{3})-(\d{4})-(\d{4})/';
$callback = function($matches) {
  return $matches[1] . '-' . $matches[2] . '-' . $matches[3];
};

$result = preg_replace_callback($pattern, $callback, $subject);
echo $result; // 出力: 電話番号: 080-1234-5678

例3:HTML タグを除去する

この例では、対象文字列からすべての HTML タグを除去します。

$subject = "<p>これはHTMLタグを含む文章です。</p>";
$pattern = '/<[^>]*>/';
$callback = function($matches) {
  return '';
};

$result = preg_replace_callback($pattern, $callback, $subject);
echo $result; // 出力: これはHTMLタグを含む文章です。

preg_replace_callback 関数は、正規表現とコールバック関数を利用して、様々な種類の String 操作を柔軟かつ効率的に行うことができます。パターンとコールバック関数の組み合わせを理解することで、より高度な文字列処理が可能になります。



  • データ操作
    • 数値をカンマ区切りでフォーマットする
    • 電話番号をハイフン区切りでフォーマットする
    • 日付を別の形式に変換する
  • テキスト処理
    • HTML タグを除去する
    • メールアドレスを匿名化する
    • IP アドレスを隠蔽する
  • 基本的な置換
    • 特定の文字列を別の文字列に置き換える
    • 大文字小文字を逆転させる
    • 空白文字を削除する

このリポジトリには、以下の内容が含まれています。

  • 各コードの使用例
  • コードの説明と実行結果

使い方

  1. 上記の GitHub リポジトリをクローンするか、ダウンロードします。
  2. index.php ファイルを実行します。
  • コードの一部を改変して利用することも可能ですが、その場合は動作保証はいたしかねます。


以下に、preg_replace_callback の代替となる手法とその利点・欠点をご紹介します。

str_replace 関数

利点

  • 処理速度が速い
  • シンプルで分かりやすい

欠点

  • コールバック関数を利用できない
  • 正規表現ほど強力ではない


$subject = "私はPHPが好きです。";
$pattern = "PHP";
$replacement = "JavaScript";

$result = str_replace($pattern, $replacement, $subject);
echo $result; // 出力: 私はJavaScriptが好きです。

mb_ereg_replace_callback 関数

利点

  • マルチバイト文字列に対応している

欠点

  • preg_replace_callback 関数よりも非効率


$subject = "私はPHPが好きです。";
$pattern = "/PHP/u";
$callback = function($matches) {
  return 'JavaScript';
};

$result = mb_ereg_replace_callback($pattern, $callback, $subject);
echo $result; // 出力: 私はJavaScriptが好きです。

手動でループ処理を行う

利点

  • コードフローを完全に制御できる

欠点

  • 処理速度が遅い
  • 複雑で冗長なコードになりやすい


$subject = "私はPHPが好きです。";
$pattern = "/PHP/u";
$replacement = "JavaScript";

$result = "";
preg_match_all($pattern, $subject, $matches);
foreach ($matches[0] as $key => $match) {
  $result .= substr($subject, 0, $matches[0][$key]);
  $result .= $replacement;
  $subject = substr($subject, strlen($match) + $matches[0][$key]);
}
$result .= $subject;

echo $result; // 出力: 私はJavaScriptが好きです。

正規表現ライブラリを使用する

利点

  • preg_replace_callback 関数よりも機能が豊富な場合がある

欠点

  • ライブラリの導入と学習が必要


最適な代替方法の選択

上記で紹介した代替方法はそれぞれ利点と欠点があります。状況に応じて、最適な方法を選択することが重要です。

  • より高度な機能が必要な場合は、正規表現ライブラリを利用します。
  • コードフローを完全に制御する必要がある場合は、手動でループ処理を行います。
  • マルチバイト文字列を扱う場合は、mb_ereg_replace_callback 関数を利用します。
  • シンプルで高速な処理が必要な場合は、str_replace 関数を利用します。

上記以外にも、状況によっては、以下のような選択肢も検討できます。

  • lcfirst 関数: 文字列の最初の文字を小文字に変換する
  • ucfirst 関数: 文字列の最初の文字を大文字に変換する
  • strtoupper 関数: 文字列をすべて大文字に変換する
  • strtolower 関数: 文字列をすべて小文字に変換する
  • rtrim 関数: 文字列の末尾の空白文字を削除
  • ltrim 関数: 文字列の先頭の空白文字を削除する
  • trim 関数: 文字列の先頭と末尾の空白文字を削除する