|
|
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) для получения
информации относительно названий флагов
(до тех пор, пока они не задокументированы здесь ).
Sinured
30-Jul-2007 10:14
Possible flags (scratched out of fnmatch.h):
...::...
FNM_PATHNAME:
> Slash in $string only matches slash in $pattern.
FNM_PERIOD:
> Leading period in $string must be exactly matched by period in $pattern.
FNM_NOESCAPE:
> Disable backslash escaping.
FNM_NOSYS:
> Obsolescent.
FNM_FILE_NAME:
> Alias of FNM_PATHNAME.
FNM_LEADING_DIR:
> From fnmatch.h: /* Ignore `/...' after a match. */
FNM_CASEFOLD:
> Caseless match.
Since they’re appearing in file.c, but are not available in PHP, we’ll have to define them ourselves:
<?php
define('FNM_PATHNAME', 1);
define('FNM_PERIOD', 4);
define('FNM_NOESCAPE', 2);
define('FNM_FILE_NAME', FNM_PATHNAME);
define('FNM_LEADING_DIR', 8);
define('FNM_CASEFOLD', 16);
?>
I didn’t test any of these except casefold, which worked for me.
Frederik Krautwald
12-Jun-2007 10:30
soywiz's function still doesn't seem to work -- at least not with PHP 5.2.3 on Windows -- but jk's does.
soywiz at NOSPAM dot php dot net
20-Jan-2007 07:40
A revised better alternative for fnmatch on windows. It should work well on PHP >= 4.0.0
<?php
if (!function_exists('fnmatch')) {
function fnmatch($pattern, $string) {
return @preg_match(
'/^' . strtr(addcslashes($pattern, '/\\.+^$(){}=!<>|'),
array('*' => '.*', '?' => '.?')) . '$/i', $string
);
}
}
?>
jk at ricochetsolutions dot com
13-Dec-2006 05:39
soywiz's function didnt seem to work for me, but this did.
<?php
if(!function_exists('fnmatch')) {
function fnmatch($pattern, $string) {
return preg_match("#^".strtr(preg_quote($pattern, '#'), array('\*' => '.*', '\?' => '.'))."$#i", $string);
} } ?>
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";
|