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

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

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

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

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

)

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

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

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

)

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

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

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

)

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

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

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

)

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