我希望能够将字符串与通配符*
匹配。
实施例
$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
答案 0 :(得分:45)
这里不需要preg_match
。 PHP具有通配符比较功能,专门用于此类情况:
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);
答案 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