How do I search in an array with preg_match?
Example:
<?php if( preg_match( '/(my\n+string\n+)/i' , array( 'file' , 'my string => name', 'this') , $match) ) { //Excelent!! $items[] = $match[1]; } else { //Ups! not found! } ?>
The preg_match() function returns whether a match was found in a string.
Return Values ¶ preg_match() returns 1 if the pattern matches given subject , 0 if it does not, or false on failure. This function may return Boolean false , but may also return a non-Boolean value which evaluates to false .
PHP | preg_match() Function. This function searches string for pattern, returns true if pattern exists, otherwise returns false.
In this post I'll provide you with three different methods of doing what you ask for. I actually recommend using the last snippet, since it's easiest to comprehend as well as being quite neat in code.
There is a function dedicated for just this purpose, preg_grep
. It will take a regular expression as first parameter, and an array as the second.
See the below example:
$haystack = array ( 'say hello', 'hello stackoverflow', 'hello world', 'foo bar bas' ); $matches = preg_grep ('/^hello (\w+)/i', $haystack); print_r ($matches);
output
Array ( [1] => hello stackoverflow [2] => hello world )
array_reduce
with preg_match
can solve this issue in clean manner; see the snippet below.
$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);
output
Array ( [0] => stackoverflow [1] => world )
Documentation
array_reduce
seems tedious, isn't there another way?Yes, and this one is actually cleaner though it doesn't involve using any pre-existing array_*
or preg_*
function.
Wrap it in a function if you are going to use this method more than once.
$matches = array (); foreach ($haystack as $str) if (preg_match ('/^hello (\w+)/i', $str, $m)) $matches[] = $m[1];
Documentation
Use preg_grep
$array = preg_grep( '/(my\n+string\n+)/i', array( 'file' , 'my string => name', 'this') );
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With