fnmatch

(PHP 4 >= 4.3.0, PHP 5)

fnmatch -- Совпадает ли имя файла с шаблоном

Описание

bool fnmatch ( string pattern, string string [, int flags] )

fnmatch() проверяет, совпадает ли переданный параметр string с указанным шаблоном подстановок оболочки (shell wildcard) pattern.

Эта функция полезна при рабоде с именами файлов, хотя может быть использована и на обычной строке. Среднестатистический пользователь знаком с подстановками оболочки, как минимум в их простейшей форме из подстановок '?' и '*', так что использование fnmatch() вместо ereg() или preg_match() для поиска в пользовательской части сайта может быть намного удобнее для пользователей, не знакомых с регулярными выражениями.

Пример 1. Проверяет, соответствует ли цвет шаблону подстановок оболочки.

<?php
if (fnmatch("*gr[ae]y", $color)) {
  echo
"some form of gray ...";
}
?>

Внимание

На данный момент эта функция недоступна в Windows и других POSIX-несовместимых системах.

См. также описание функций glob(), ereg(), preg_match() и Unix manpage по теме fnmatch(3) для получения информации относительно названий флагов (до тех пор, пока они не задокументированы здесь ).



fnmatch
soywiz at php dot net
17-Jul-2006 07:12
A better "fnmatch" alternative for windows that converts a fnmatch pattern into a preg one. It should work on PHP >= 4.0.0

<?php
  
if (!function_exists('fnmatch')) {
       function
fnmatch($pattern, $string) {
           return @
preg_match('/^' . strtr(addcslashes($pattern, '\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string);
       }
   }
?>
jsnell at networkninja dot com
02-Mar-2006 07:12
The last line of soywiz at gmail dot com windows replacement should be changed to:

   return preg_match('/' . $npattern . '$/i', $string);

otherwise, a pattern for *.xml will match file.xml~ or any else anything with the text *.xml in it, regardless of position.
soywiz at gmail dot com
26-Jul-2005 04:07
A "fnmatch" alternative that converts the pattern, to a valid preg one and uses preg_match then. It will work on windows.

<?php
if (!function_exists('fnmatch')) {
function
fnmatch($pattern, $string) {
   for (
$op = 0, $npattern = '', $n = 0, $l = strlen($pattern); $n < $l; $n++) {
       switch (
$c = $pattern[$n]) {
           case
'\\':
              
$npattern .= '\\' . @$pattern[++$n];
           break;
           case
'.': case '+': case '^': case '$': case '(': case ')': case '{': case '}': case '=': case '!': case '<': case '>': case '|':
              
$npattern .= '\\' . $c;
           break;
           case
'?': case '*':
              
$npattern .= '.' . $c;
           break;
           case
'[': case ']': default:
              
$npattern .= $c;
               if (
$c == '[') {
                  
$op++;
               } else if (
$c == ']') {
                   if (
$op == 0) return false;
                  
$op--;
               }
           break;
       }
   }

   if (
$op != 0) return false;

   return
preg_match('/' . $npattern . '/i', $string);
}
}
?>
phlipping at yahoo dot com
06-Aug-2003 03:59
you couls also try this function that I wrote before I found fnmatch:

function WildToReg($str)
{
  $s = ""; 
  for ($i = 0; $i < strlen($str); $i++)
  {
   $c = $str{$i};
   if ($c =='?')
   $s .= '.'; // any character
   else if ($c == '*')   
   $s .= '.*'; // 0 or more any characters   
   else if ($c == '[' || $c == ']')
   $s .= $c;  // one of characters within []
   else
   $s .= '\\' . $c;
  }
  $s = '^' . $s . '$';

  //trim redundant ^ or $
  //eg ^.*\.txt$ matches exactly the same as \.txt$
  if (substr($s,0,3) == "^.*")
   $s = substr($s,3);
  if (substr($s,-3,3) == ".*$")
   $s = substr($s,0,-3);
  return $s;
}

if (ereg(WildToReg("*.txt"), $fn))
  print "$fn is a text file";
else
  print "$fn is not a text file";

<flockfopen>
 Last updated: Tue, 15 Nov 2005