2011-11-13 4 views
1

私は一致しようとしています。 PHPのpreg_matchを使用して\または/preg_match。 /またはPHPの

私はこれを行うと思っていましたが、すべての文字列に一致しています。

$string = ''; 
$chars = '/(\.|\\|\/)/'; 
if (preg_match($chars, $string) != 0) { 
    echo 'Chars found.'; 
} 
+0

試しましたか?何かエラーがありますか? –

+0

すべてが一致します。\または/が付いた文字列だけではありません。私は間違いがない。 –

答えて

3

引数は文字列です。文字列はPHPによって自動的にエスケープされます。たとえば、{\\\\}(バックスラッシュ)をregexpエンジンに与えた場合、PHPは最初にそれを解析して{\\}\\\に置き換えられます)を作成します。

次に、regexpエンジンは正規表現を解析します。それはPHPがregexpエンジンに与えた{\\}を見る。それは\によってエスケープされた\文字に実際に一致します。

あなたの場合、それは/(\.|\\|\/)/のように見えます。 PHPは正規表現エンジン/(\.|\|\/)/に実際には.または|/のいずれかを返します(|文字がエスケープされていることに注意してください)。

私は個人的に、メタ文字のエスケープを避けようとしています。特に、正規表現エンジンがどのように動作するかではあります。私は通常、代わりに[.]を使用します。より読みやすくなっています。これで書かれた正規表現は/([.]|\\\\|[/])/のようになります。

ほとんどの最適化を行うことはできません。それは私の個人的なものですが、私は区切り文字として{}を使用することを好みます(はい、文字のペアを使用できます)。また、あなたの正規表現は一文字にマッチしますので、私の意見では非常に読みやすい{[.\\\\/]}と書くことができます(PHPと正規表現の両方のエンジンがバックスラッシュを解析するため、4つのスラッシュが必要です)。

また、preg_match()は一致の数を返します。それは常に0より大きくなりますので、ブール値であると簡単に考えることができ、書き込みは避けてください== 0。代わりに、文字列の前に!を挿入して、負の値にすることができます。しかし、私はあなたが誤って条件を逆転したと思います(それが一致しない場合は一致します)。有効なコード:

$string = ''; 
$chars = '{[.\\\\/]}'; 
if (preg_match($chars, $string)) { 
    echo 'Chars found.'; 
} 
+0

パーフェクト!ありがとう! –

1

問題はおそらくPHPにあります。正規表現の文字列で何かをエスケープするときは、エスケープするバックスラッシュをエスケープする必要があります。そうしないと、PHPはそれを特殊文字として解釈しようとします。

これはおそらく意味をなさないので、例を挙げてください。

$string = "\."は、PHPが。をエスケープしようとしますが失敗します。代わりにこれを$string = "\\\."に変更する必要があります。

+2

一重引用符を使用しない場合。 – knittl

+0

ああ、私はそれについて忘れてしまった。 – slugonamission

3

お客様のifロジックに欠陥があります。 preg_matchは一致の数を返します。したがって、== 0は「不一致」を意味します。

つまり、single quoted stringsは、\'\\以外のエスケープシーケンスを展開しません。期待どおり正規表現に表示するには、バックスラッシュエスケープを倍増する必要があります。あなたのコードは、に変更します。

$string = ''; 
$chars = '/(\.|\\\\|\/)/'; 
if (preg_match($chars, $string) != 0) { 
    echo 'Chars found.'; 
} 

ここではテストケースです:

$strings = array('', '.', '/', '\\', 'abc'); 
$pattern= '/(\.|\\\\|\/)/' 

foreach($strings as $string) { 
    if (preg_match($pattern, $string) > 0) { 
     printf('String "%s" matched!', $string); 
    } 
} 
+0

ああ、コードを更新しました。それは私の例では単にタイプミスでした。問題は残っている。 –

0

REGEXマッチスラッシュしようとすると、私は強く、「/」とは異なる区切り文字を使用してお勧めします。それはあなたがする必要がある脱出の量を減らし、それがはるかに読みやすくなります:

$chars = '%(\.|\\|/)%'; 
+0

いいですが、まだすべてが一致しています。 –

0

はこれを試してみてください:preg_match()に与えられた

$chars = '%(\.|\\\\|/)%'