Я хочу дать возможность сопоставить строку с подстановочным знаком *
.
пример
$mystring = 'dir/folder1/file'; $pattern = 'dir/*/file'; stringMatchWithWildcard($mystring,$pattern); //> Returns true
Пример 2:
$mystring = 'string bl#abla;y'; $pattern = 'string*y'; stringMatchWithWildcard($mystring,$pattern); //> Returns true
Я подумал что-то вроде:
function stringMatch($source,$pattern) { $pattern = preg_quote($pattern,'/'); $pattern = str_replace( '\*' , '.*?', $pattern); //> This is the important replace return (bool)preg_match( '/^' . $pattern . '$/i' , $source ); }
В основном замена *
на .*?
(учитывая, что в среде *nix
*
соответствует empty
строке) © vbence
Любые улучшения / предложения?
// Добавлено return (bool)
потому что preg_match возвращает int
Здесь нет необходимости в preg_match
. PHP имеет функцию сравнения по шаблону, специально предназначенную для таких случаев:
fnmatch()
И fnmatch('dir/*/file', 'dir/folder1/file')
, скорее всего, уже сработает для вас. Но будьте осторожны, что подстановочный знак *
также будет добавлять дополнительные слэши, например preg_match.
.+?
Вызывает не-жадное соответствие для всех символов. Это НЕ равно «*», потому что он не будет соответствовать пустой строке.
Следующий шаблон также будет соответствовать пустой строке:
.*?
так…
stringMatchWithWildcard ("hello", "hel*lo"); // will give true
Вы смешиваете финал ( $
) и начало ( ^
). Эта:
preg_match( '/$' . $pattern . '^/i' , $source );
Должно быть:
preg_match( '/^' . $pattern . '$/i' , $source );
Единственная проблема, с которой вы preg_quote()
, заключается в том, что вызов preg_quote()
приведет к preg_quote()
символа звездочки. Учитывая это, ваш str_replace()
заменит str_replace()
*
, но не символ escape перед ним.
Поэтому вы должны изменить str_replace('*' ..)
с str_replace('\*'..)
Вы должны просто использовать .*
Вместо этого.
$pattern = str_replace( '*' , '.*', $pattern); //> This is the important replace
Изменить: также ваши ^
и $
были в неправильном порядке.
<?php function stringMatchWithWildcard($source,$pattern) { $pattern = preg_quote($pattern,'/'); $pattern = str_replace( '\*' , '.*', $pattern); return preg_match( '/^' . $pattern . '$/i' , $source ); } $mystring = 'dir/folder1/file'; $pattern = 'dir/*/file'; echo stringMatchWithWildcard($mystring,$pattern); $mystring = 'string bl#abla;y'; $pattern = 'string*y'; echo stringMatchWithWildcard($mystring,$pattern);
Рабочая демонстрация: http://www.ideone.com/mGqp2