私は一致しようとしています。 PHPのpreg_matchを使用して\または/preg_match。 /またはPHPの
私はこれを行うと思っていましたが、すべての文字列に一致しています。
$string = '';
$chars = '/(\.|\\|\/)/';
if (preg_match($chars, $string) != 0) {
echo 'Chars found.';
}
私は一致しようとしています。 PHPのpreg_matchを使用して\または/preg_match。 /またはPHPの
私はこれを行うと思っていましたが、すべての文字列に一致しています。
$string = '';
$chars = '/(\.|\\|\/)/';
if (preg_match($chars, $string) != 0) {
echo 'Chars found.';
}
引数は文字列です。文字列はPHPによって自動的にエスケープされます。たとえば、{\\\\}
(バックスラッシュ)をregexpエンジンに与えた場合、PHPは最初にそれを解析して{\\}
(\\
は\
に置き換えられます)を作成します。
次に、regexpエンジンは正規表現を解析します。それはPHPがregexpエンジンに与えた{\\}
を見る。それは\
によってエスケープされた\
文字に実際に一致します。
あなたの場合、それは/(\.|\\|\/)/
のように見えます。 PHPは正規表現エンジン/(\.|\|\/)/
に実際には.
または|/
のいずれかを返します(|
文字がエスケープされていることに注意してください)。
私は個人的に、メタ文字のエスケープを避けようとしています。特に、正規表現エンジンがどのように動作するかではあります。私は通常、代わりに[.]
を使用します。より読みやすくなっています。これで書かれた正規表現は/([.]|\\\\|[/])/
のようになります。
ほとんどの最適化を行うことはできません。それは私の個人的なものですが、私は区切り文字として{}
を使用することを好みます(はい、文字のペアを使用できます)。また、あなたの正規表現は一文字にマッチしますので、私の意見では非常に読みやすい{[.\\\\/]}
と書くことができます(PHPと正規表現の両方のエンジンがバックスラッシュを解析するため、4つのスラッシュが必要です)。
また、preg_match()
は一致の数を返します。それは常に0
より大きくなりますので、ブール値であると簡単に考えることができ、書き込みは避けてください== 0
。代わりに、文字列の前に!
を挿入して、負の値にすることができます。しかし、私はあなたが誤って条件を逆転したと思います(それが一致しない場合は一致します)。有効なコード:
$string = '';
$chars = '{[.\\\\/]}';
if (preg_match($chars, $string)) {
echo 'Chars found.';
}
パーフェクト!ありがとう! –
問題はおそらくPHPにあります。正規表現の文字列で何かをエスケープするときは、エスケープするバックスラッシュをエスケープする必要があります。そうしないと、PHPはそれを特殊文字として解釈しようとします。
これはおそらく意味をなさないので、例を挙げてください。
$string = "\."
は、PHPが。をエスケープしようとしますが失敗します。代わりにこれを$string = "\\\."
に変更する必要があります。
一重引用符を使用しない場合。 – knittl
ああ、私はそれについて忘れてしまった。 – slugonamission
お客様の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);
}
}
ああ、コードを更新しました。それは私の例では単にタイプミスでした。問題は残っている。 –
REGEXマッチスラッシュしようとすると、私は強く、「/」とは異なる区切り文字を使用してお勧めします。それはあなたがする必要がある脱出の量を減らし、それがはるかに読みやすくなります:
$chars = '%(\.|\\|/)%';
いいですが、まだすべてが一致しています。 –
はこれを試してみてください:preg_match()
に与えられた
$chars = '%(\.|\\\\|/)%'
試しましたか?何かエラーがありますか? –
すべてが一致します。\または/が付いた文字列だけではありません。私は間違いがない。 –