2011-10-19 41 views
2

是否可以对array_search使用通配符?我想搜索字符串的一部分,然后数组搜索中的通配符

像(带星号)

print $pos = array_search('abitofastring%', $vars['myarray']); 
unset($vars['myarray'][$pos]); 

回答

6

是可以使用通配符array_search

不,但可以使用正则表达式(支持通配符)和preg_grep函数。

例子:

$array = explode(',', "House,Car,Boat,Horse,Pool Boy"); 

# remove all strings from array that do not contain "ho" 

$array = preg_grep('~ho~i', $array, PREG_GREP_INVERT); 

则数组是:

Array 
(
    [1] => Car 
    [2] => Boat 
    [4] => Pool Boy 
) 

因为它可以是复杂的写正则表达式模式,它可能是很方便的有转换你的SQL LIKE的辅助功能模式转换为正则表达式,因此可以更容易地使用它:

$array = explode(',', "House,Car,Boat,Horse,Pool Boy"); 

# Search for "Ho" at the beginning of each string 

$regex = like_to_regex('Ho%'); 

$array = preg_grep($regex, $array, PREG_GREP_INVERT); 

print_r($array); 

/** 
* convert a MySQL LIKE pattern into a pcre pattern 
*/ 
function like_to_regex($like, $casesensitive = FALSE, $escapechar = '\\') 
{ 
    $pattern = sprintf('~(?<!%1$s)(%1$s{2}|%%|_)~', preg_quote($escapechar)); 
    $tokens = preg_split($pattern, $like, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
    foreach($tokens as &$token) 
    { 
     switch($token) 
     { 
      case $escapechar.$escapechar: 
       $token = preg_quote($escapechar); 
       break; 
      case '_': 
       $token = '.'; 
       break; 
      case '%': 
       $token = '.*'; 
       break; 
      default: 
       $token = preg_quote($token); 

     } 
    } 
    return sprintf('~^%s$~%s', implode('', $tokens), $casesensitive ? '':'i'); 
} 
+0

〜我在preg_gre中指的是什么P()? –

+0

@WilliamKheng:“〜”是模式的结尾分隔符,“i”是case- * i * nsensitive的标志 - 即接受小写字母和大写字母。 – hakre