web-dev-qa-db-ja.com

ワイルドカード*?と一致するphp文字列

文字列をワイルドカード_*_と一致させる可能性を与えたいです。

_$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)を追加しました

28
dynamic

ここでは_preg_match_の必要はありません。 PHPにはワイルドカード比較機能があり、このような場合に特に適しています。

fnmatch()

そして、fnmatch('dir/*/file', 'dir/folder1/file')はおそらく既にあなたのために働いているでしょう。ただし、_*_ワイルドカードは、preg_matchと同様に、さらにスラッシュを追加することに注意してください。

47
mario

代わりに.*を使用するだけです。

$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
Dogbert
.+?

すべての文字に対して欲張りでないマッチングを行います。空の文字列と一致しないため、これは「*」と等しくありません。

次のパターンも空の文字列に一致します。

.*?

そう...

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

エンディングをミックスしています($)と始まり(^)。この:

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

する必要があります:

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

あなたが持っている1つの問題は、preg_quote()の呼び出しがアスタリスク文字をエスケープすることです。その場合、str_replace()は_*_を置き換えますが、その前のエスケープ文字は置き換えません。

したがって、str_replace('*' ..)str_replace('\*'..)で変更する必要があります

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