web-dev-qa-db-ja.com

preg_matchで配列を検索する方法は?

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!
}
?>
49

この投稿では、あなたが求めていることを行う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_reducepreg_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];

ドキュメント

142

preg_grep を使用します

$array = preg_grep(
    '/(my\n+string\n+)/i',
    array( 'file' , 'my string  => name', 'this')
);
5
Galen

array_walkを使用して、preg_match関数を配列の各要素に適用できます。

http://us3.php.net/array_walk

3
Logan Serman
$items = array();
foreach ($haystacks as $haystack) {
    if (preg_match($pattern, $haystack, $matches)
        $items[] = $matches[1];
}
2
goat
$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
)
1