現在の位置: ホーム> 最新記事一覧> 複数のパターンオーダーオーバーライト:最初にどのコールバックが実行されますか?

複数のパターンオーダーオーバーライト:最初にどのコールバックが実行されますか?

M66 2025-05-17

PHPでは、 preg_replace_callback_array関数は、複数の正規表現パターンに異なるコールバック関数を指定できる強力なツールです。この関数は、パターンを連想配列を介してコールバック関数に関連付け、順番に置き換えます。ただし、コールバック関数の実行順序はどのように決定されますか?

preg_replace_callback_arrayの基本的な使用

preg_replace_callback_array関数は2つのパラメーターを受け入れます。最初のパラメーターは連想配列、配列の鍵は正規表現パターン、値はコールバック関数です。 2番目のパラメーターは入力文字列です。関数は、アレイで定義されたパターンの順序で、パターンごとに一致し、入力文字列を置き換えます。

サンプルコード

<?php
$patterns = [
    '/hello/' => function ($matches) {
        return "Hi";
    },
    '/world/' => function ($matches) {
        return "Earth";
    }
];

$string = "hello world! hello world!";
$result = preg_replace_callback_array($patterns, $string);
echo $result;  // 出力:Hi Earth! Hi Earth!
?>

この例では、入力文字列「Hello World!Hello World!」最初にhelloに一致してから、 hiに置き換えられます。その後、それは世界に一致し、地球に置き換えられます。コールバック関数の実行順序は、配列のパターン定義の順序に従って決定されます。

コールバック関数の実行順序の決定要因

preg_replace_callback_arrayのコールバック関数の実行順序は、次の要因によって厳密に決定されます。

  1. 配列のパターンの順序:コールバック関数の実行の順序は、渡されたパターン配列のキー(つまり、正規表現パターン)の順序によって決定されます。 PHPは、配列の最初のパターンから開始し、コールバック関数を1つずつ順番に実行します。

  2. パターンマッチングの優先順位:複数の正規表現パターンが同じ位置に一致する場合(たとえば、2つのパターンが文字列の同じパートと一致する)、PHPはパターン配列の順序に従って最初の一致パターンを選択してコールバック関数を実行します。したがって、パターンの順序が重要です。

  3. グローバルマッチングの影響:パターンが文字列の一部と一致して交換される場合、新しい文字列の内容は、後続のパターンのマッチングに影響する可能性があります。したがって、交換された文字列コンテンツは、後続のコールバック関数の実行に影響します。

例:複数のパターンが同じ部分と一致します

<?php
$patterns = [
    '/o/' => function ($matches) {
        return "O";
    },
    '/world/' => function ($matches) {
        return "Universe";
    }
];

$string = "hello world!";
$result = preg_replace_callback_array($patterns, $string);
echo $result;  // 出力:hellO Universe!
?>

この例では、 / world /パターンは世界と一致しますが、 / o /パターンは最初に一致し、文字列のOに置き換えられているため、最終出力はHello Universeです!

複雑な状況に対するコールバック機能の実行順序の影響

複数のパターンが同じ位置またはサブストリングと一致する場合、コールバック関数が実行される順序は特に重要になります。特定のコールバック関数が最初に実行されることを確認する場合は、関連する正規表現パターンを配列の前に配置する必要があります。

たとえば、異なるリンクとHTMLタグを含む文字列があり、最初にリンクを置き換えてからHTMLタグを置き換えるとします。この時点で、リンクの交換のパターンは、HTMLタグ交換のパターンよりも先にある必要があります。

 <?php
$patterns = [
    '/https?:\/\/\S+/' => function ($matches) {
        return "<a href='{$matches[0]}'>Link</a>";
    },
    '/<b>.*?<\/b>/' => function ($matches) {
        return "<strong>{$matches[0]}</strong>";
    }
];

$string = "Visit https://m66.net for more <b>information</b>!";
$result = preg_replace_callback_array($patterns, $string);
echo $result;  // 出力:Visit <a href='https://m66.net'>Link</a> for more <strong><b>information</b></strong>!
?>

この例では /https?:\/\/\ s+/モードはリンク最初に置き換えます。最終結果は、リンクとタグの両方が正しく交換されることです。

要約します

preg_replace_callback_array関数を使用すると、連想配列を介して複数の正規表現パターンとそのコールバック関数を定義できます。コールバック関数の実行の順序は、パターン配列のパターンの順序によって決定されます。複数のパターンが同じ部分と一致する場合、優先マッチングパターンは最初に対応するコールバック関数を実行します。したがって、 preg_replace_callback_arrayを使用する場合、パターン配列の順序がニーズを満たしていることを確認してください。