• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • preg_grep()

    (PHP 4, PHP 5, PHP 7)

    返回匹配模式的数组条目

    说明

    preg_grep(string $pattern,array $input[,int $flags= 0]): array

    返回给定数组$input中与模式$pattern匹配的元素组成的数组.

    参数

    $pattern

    要搜索的模式,字符串形式.

    $input

    输入数组.

    $flags

    如果设置为PREG_GREP_INVERT,这个函数返回输入数组中与给定模式$pattern匹配的元素组成的数组.

    返回值

    返回使用$input中key做索引的数组.

    范例

    preg_grep()示例

    <?php
    // 返回所有包含浮点数的元素
    $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
    ?>
    

    参见

    A shorter way to run a match on the array's keys rather than the values:
    <?php
    function preg_grep_keys($pattern, $input, $flags = 0) {
      return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
    }
    ?>
    
    Run a match on the array's keys rather than the values:
    <?php
    function preg_grep_keys( $pattern, $input, $flags = 0 )
    {
      $keys = preg_grep( $pattern, array_keys( $input ), $flags );
      $vals = array();
      foreach ( $keys as $key )
      {
        $vals[$key] = $input[$key];
      }
      return $vals;
    }
    ?>
    
    This may be obvious to most experienced developers,but just in case its not,when using preg_grep to check for whitelisted items ,one must be very careful to explicitly define the regex boundaries or it will fail
    <?php
    $whitelist = ["home","dashboard","profile","group"];
    $possibleUserInputs = ["homd","hom","ashboard","settings","group"];
    foreach($possibleUserInputs as $input)
    {
       if(preg_grep("/$input/i",$whitelist)
      {
         echo $input." whitelisted";
      }else{
         echo $input." flawed";
      }
    }
    ?>
    This results in:
    homd flawed
    hom whitelisted
    ashboard whitelisted
    settings flawed
    group whitelisted
    I think this is because if boundaries are not explicitly defined,preg_grep looks for any instance of the substring in the whole array and returns true if found.This is not what we want,so boundaries must be defined.
    <?php
    foreach($possibleUserInputs as $input)
    {
       if(preg_grep("/^$input$/i",$whitelist)
      {
         echo $input." whitelisted";
      }else{
         echo $input." flawed";
      }
    }
    ?>
    this results in:
    homd flawed
    hom flawed
    ashboard flawed
    settings flawed
    group whitelisted
    in_array() will also give the latter results but will require few tweaks if say,the search is to be case insensitive,which is always the case 70% of the time
    An even shorter way to run a match on the array's keys rather than the values:
    <?php
    function preg_grep_keys($pattern, $input, $flags = 0) {
      return array_flip( preg_grep($pattern, array_flip($input), $flags ) );
    }
    ?>
    

    上篇:preg_filter()

    下篇:preg_last_error()