Я хочу дать возможность сопоставить строку с подстановочным знаком * . 
пример
 $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