正規表現パターンの一致を反復処理したい。
preg_match_all()
必要のないすべての一致の一時的な配列が生成されるため、使用したくありません。また、完全な反復子クラスを構築して物事を肥大化させるのも好きではありません。
幸いなことに、PHP 5.5 には優れたyield構文が導入されています。これを組み合わせるpreg_match()
ことで、この問題を解決できるのではないでしょうか?
文字列のすべての単語をループする単純な反復子の例:
function wordIterator($str)
{
$offset = 0;
while ( preg_match('/\w+/', $str, $m, PREG_OFFSET_CAPTURE, $offset)) {
$offset = $m[0][1] + strlen($m[0][0]);
yield $m[0][0];
}
}
foreach( wordIterator('Lorem ipsum dolor.') as $word) {
echo $word.'<br>';
}