preg_match_all()において置換時のパターン文字列の動作

preg_match_all()は、正規表現検索を繰り返し行い、一致するパターンの文字列を全て取り出すことができる関数です。単純に文字列を置き換えるだけならこの関数は必要ありませんが、何らかの理由でこの関数を使い、以下のような書式にすると一部のパターン文を取り出せなくなります。

特定のパターン文字とその後部に異なる単語を追加したパターン文字

1
2
3
4
5
6
7
$str="果物のイチゴからイチゴジャムが作られる";
preg_match_all('/イチゴ|イチゴジャム/', $str, $match);
echo '
<pre>';
print_r($match);
echo '</pre>
';
実行結果:

Array
(
    [0] => Array
        (
            [0] => イチゴ
            [1] => イチゴ
        )

)

特定のパタン文字の後部に異なる単語を追加した文字列とそれを追加しない特定パタン文字

1
2
3
4
5
6
7
$str="果物のイチゴからイチゴジャムが作られる";
preg_match_all('/イチゴジャム|イチゴ/', $str, $match);
echo '
<pre>';
print_r($match);
echo '</pre>
';
実行結果:

Array
(
    [0] => Array
        (
            [0] => イチゴ
            [1] => イチゴジャム
        )

)

特定のパタン文字とその前部に異なる単語を追加した文

1
2
3
4
5
6
7
$str="穀類のコーンにはスイートコーンがある";
preg_match_all('/コーン|スイートコーン/', $str, $match);
echo '
<pre>';
print_r($match);
echo '</pre>
';
実行結果:

Array
(
    [0] => Array
        (
            [0] => コーン
            [1] => スイートコーン
        )

)

特定のパタン文の前部に異なる単語を追加した文字列とそれを追加しない特定パタン文

1
2
3
4
5
6
7
$str="穀類のコーンにはスイートコーンがある";
preg_match_all('/スイートコーン|コーン/', $str, $match);
echo '
<pre>';
print_r($match);
echo '</pre>
';
実行結果:

Array
(
    [0] => Array
        (
            [0] => コーン
            [1] => スイートコーン
        )

)

パターンを複数指定した場合、特定pattern文字列(文)の前方の単語が一致してしまうと、左から順に最初に一致したpattern文のみマッチします。反対にどちらかのpattern文の先頭に異なる単語を追加すると両方にマッチします。そして、このように同じ単語を含むpattern文の場合、文字列の長い方を短い方より左側に移動させると、上記のどのケースでも両方にマッチします。上記の四つのやり方の中では、一番最初の書式だけがうまく取り出せません。