Preg_matchで配列を検索するにはどうすればよいですか?
例:
<?php
if( preg_match( '/(my\n+string\n+)/i' , array( 'file' , 'my string => name', 'this') , $match) )
{
//Excelent!!
$items[] = $match[1];
} else {
//Ups! not found!
}
?>
この投稿では、あなたが求めていることを行う3つの異なる方法を提供します。実際に最後のスニペットを使用することをお勧めします。コードを理解するのが最も簡単であり、コードが非常にきれいであるためです。
この目的専用の関数preg_grep
があります。最初のパラメーターとして正規表現を取り、2番目のパラメーターとして配列を取ります。
以下の例を参照してください。
$haystack = array (
'say hello',
'hello stackoverflow',
'hello world',
'foo bar bas'
);
$matches = preg_grep ('/^hello (\w+)/i', $haystack);
print_r ($matches);
出力
Array
(
[1] => hello stackoverflow
[2] => hello world
)
array_reduce
でpreg_match
を使用すると、この問題をきれいに解決できます。以下のスニペットを参照してください。
$haystack = array (
'say hello',
'hello stackoverflow',
'hello world',
'foo bar bas'
);
function _matcher ($m, $str) {
if (preg_match ('/^hello (\w+)/i', $str, $matches))
$m[] = $matches[1];
return $m;
}
// N O T E :
// ------------------------------------------------------------------------------
// you could specify '_matcher' as an anonymous function directly to
// array_reduce though that kind of decreases readability and is therefore
// not recommended, but it is possible.
$matches = array_reduce ($haystack, '_matcher', array ());
print_r ($matches);
出力
Array
(
[0] => stackoverflow
[1] => world
)
ドキュメント
array_reduce
を使用するのは退屈に思えますが、別の方法はありませんか?はい、これは既存のarray_*
またはpreg_*
関数を使用する必要はありませんが、実際はよりクリーンです。
このメソッドを複数回使用する場合は、関数でラップします。
$matches = array ();
foreach ($haystack as $str)
if (preg_match ('/^hello (\w+)/i', $str, $m))
$matches[] = $m[1];
ドキュメント
preg_grep を使用します
$array = preg_grep(
'/(my\n+string\n+)/i',
array( 'file' , 'my string => name', 'this')
);
array_walk
を使用して、preg_match
関数を配列の各要素に適用できます。
$items = array();
foreach ($haystacks as $haystack) {
if (preg_match($pattern, $haystack, $matches)
$items[] = $matches[1];
}
$haystack = array (
'say hello',
'hello stackoverflow',
'hello world',
'foo bar bas'
);
$matches = preg_grep('/hello/i', $haystack);
print_r($matches);
出力
Array
(
[1] => say hello
[2] => hello stackoverflow
[3] => hello world
)