php字符串与通配符*匹配?

时间:2011-05-28 17:00:24

标签: php regex string-matching

我希望能够将字符串与通配符*匹配。

实施例

$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

6 个答案:

答案 0 :(得分:45)

这里不需要preg_match。 PHP具有通配符比较功能,专门用于此类情况:

  

fnmatch()

fnmatch('dir/*/file', 'dir/folder1/file')可能已经适合你了。但要注意*通配符同样会添加更多的斜杠,就像preg_match那样。

答案 1 :(得分:2)

您应该使用.*代替。

$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

答案 2 :(得分:2)

.+?

导致所有字符的非贪婪匹配。这不等于“*”,因为它与空字符串不匹配。

以下模式也会匹配空字符串:

.*?

所以...

stringMatchWithWildcard ("hello", "hel*lo"); // will give true

答案 3 :(得分:2)

你正在混淆结尾($)和开始(^)。这样:

preg_match( '/$' . $pattern . '^/i' , $source );

应该是:

preg_match( '/^' . $pattern . '$/i' , $source );

答案 4 :(得分:0)

您遇到的一个问题是对preg_quote()的调用将转义星号字符。鉴于此,您的str_replace()将替换*,但不会替换前面的转义字符。

因此,您应该使用str_replace('*' ..)

更改str_replace('\*'..)

答案 5 :(得分:0)

$pattern = str_replace( '\*' , '.+?', $pattern);   // at least one character