他の人はあなたが間違ったパラメータを渡していると指摘しました。しかし、あなたはまた、車輪の再発明をしています。phpの正規表現match-all (おっと、間違った関数をリンクしていた)を見てください。次のフラグと一緒に使用すると、オフセット付きのすべての一致の配列がすでに返されます。
フラグ
フラグは次のフラグにすることができます。
PREG_OFFSET_CAPTURE
このフラグが渡されると、一致が発生するたびに、追加の文字列オフセットも返されます。これにより、一致の値が配列に変更されることに注意してください。すべての要素は、オフセット0の一致した文字列と、オフセット1のサブジェクトへのその文字列オフセットで構成される配列です。
検索語に1文字のパターンを使用する$letter = '/e/'
と、各結果配列の2番目の要素としてすべての位置を含む配列が返されます。これにより、探している出力形式に仕上げることができます。
更新: Jaredは、パターンのキャプチャを取り戻すことができると指摘していますが、フラグを設定すると、オフセットも取得されます。OPの質問に対する直接の回答として、次のコードを試してください。
$word = "aeagle";
$pattern = "/e/";
$matches = array();
preg_match_all($pattern, $word, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
次の出力があります。
Array
(
// Matches of the first pattern: /e/
[0] => Array
(
// First match
[0] => Array
(
// Substring of $word that matched
[0] => e
// Offset into $word where previous substring starts
[1] => 1
)
[1] => Array
(
[0] => e
[1] => 5
)
)
)
preg_match_allは一度に複数のパターンに一致する可能性があるため、結果は2Dではなく3Dになります。ヒットは、指定された最初の(この場合はのみ)パターンに対するものであるため、最初の配列に含まれます。
また、最初に述べたOPとは異なり、1と5はe
文字列内の文字の正しいインデックスです。'aeagle'
aeagle
012345
^ ^
1 5
パフォーマンスの面では、strposallのカスタマイズされたバージョンは、正規表現の一致よりもおそらく高速です。ただし、組み込み関数の使用法を学ぶことは、ほとんどの場合、独自のコードを開発、テスト、サポート、および保守するよりも高速です。そして、10回のうち9回は、プログラミングの最も高価な部分です。