文字列をワイルドカード_*
_と一致させる可能性を与えたいです。
例
_$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
改善/提案はありますか?
// preg_matchがintを返すため、return (bool)
を追加しました
ここでは_preg_match
_の必要はありません。 PHPにはワイルドカード比較機能があり、このような場合に特に適しています。
そして、fnmatch('dir/*/file', 'dir/folder1/file')
はおそらく既にあなたのために働いているでしょう。ただし、_*
_ワイルドカードは、preg_matchと同様に、さらにスラッシュを追加することに注意してください。
代わりに.*
を使用するだけです。
$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);
.+?
すべての文字に対して欲張りでないマッチングを行います。空の文字列と一致しないため、これは「*」と等しくありません。
次のパターンも空の文字列に一致します。
.*?
そう...
stringMatchWithWildcard ("hello", "hel*lo"); // will give true
エンディングをミックスしています($
)と始まり(^
)。この:
preg_match( '/$' . $pattern . '^/i' , $source );
する必要があります:
preg_match( '/^' . $pattern . '$/i' , $source );
あなたが持っている1つの問題は、preg_quote()
の呼び出しがアスタリスク文字をエスケープすることです。その場合、str_replace()
は_*
_を置き換えますが、その前のエスケープ文字は置き換えません。
したがって、str_replace('*' ..)
をstr_replace('\*'..)
で変更する必要があります
$pattern = str_replace( '\*' , '.+?', $pattern); // at least one character