Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to search in an array with preg_match?

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! } ?> 
like image 916
Jorge Olaf Avatar asked Dec 24 '11 23:12

Jorge Olaf


People also ask

What is the use of Preg_match () method?

The preg_match() function returns whether a match was found in a string.

What value is return by Preg_match?

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 .

Which of the following is used by Preg_match?

PHP | preg_match() Function. This function searches string for pattern, returns true if pattern exists, otherwise returns false.


2 Answers

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.

How do I see what elements in an array that matches my regular expression?

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 ) 

Documentation

  • PHP: preg_grep - Manual

But I just want to get the value of the specified groups. How?

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

  • PHP: array_reduce - Manual
  • PHP: preg_match - Manual

Using 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

  • PHP: preg_match - Manual
like image 91
Filip Roséen - refp Avatar answered Sep 25 '22 16:09

Filip Roséen - refp


Use preg_grep

$array = preg_grep(     '/(my\n+string\n+)/i',     array( 'file' , 'my string  => name', 'this') ); 
like image 43
Galen Avatar answered Sep 24 '22 16:09

Galen