- ベストアンサー
正規表現について
PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3です。 > $str = "abc";で試してみたのですが駄目でした・・・ 失礼。条件を読み違えていました。 「abは許可しない(含めない)」という一文から、「ab を含む文字列を全て拒否」していました。 「ab の完全一致のみを拒否する」のですね。 --- <?php function test($str){ if (preg_match("/^(?!ab$)[a-z0-9]+$/", $str)) { echo $str." match<br>\n"; } else { echo $str." no match<br>\n"; } } test('01ab'); test('abc'); test('ab'); ?> --- これで下記条件を満たすことを確認しました。 - 「01ab」「abc」は許可 - 「ab」は許可しない
その他の回答 (3)
- think49
- ベストアンサー率59% (285/482)
> if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { 文字クラスは一文字の否定しかできないので、[^(ab)] は意図通りに働きません。 文字列を否定する場合は否定先読みを使います。 それと、^$ がないと部分一致になってしまいますね。 if (preg_match("/^(?:(?!ab)[a-z0-9])+$/", $str)) { # 未テストですが、上記コードをベースにすれば動くと思います。
お礼
ご返答ありがとうございます。 $str = "abc";で試してみたのですが駄目でした・・・ ベースにすればとあるのですが、どこか記述を変える必要があるのでしょうか?
- freepacket
- ベストアンサー率46% (6/13)
言葉で表現したとおり、条件指定してみては? > 1文字以上のアルファベットと数字の組み合わせは許可 preg_match("/^[a-z0-9]+$/", $str) > かつ && > 「ab」は許可しない ! preg_match("/^ab$/", $str)
お礼
ご返答ありがとうございます。 たしかに2回に分けた方が分かりやすいですね。
- yyr446
- ベストアンサー率65% (870/1330)
無理に1回の正規表現マッチングでやろうとせず、ifと組み合わせて、複数条 件でチェックした方が、結局早道で確実だったりします。 例えばまず、 1文字以上のアルファベットと数字の組み合わせかをチェックして OKだったらabかどうかをチェックすればよいのでは?
お礼
ご返答ありがとうございます。 たしかにそのやり方が良いのだと思いますが、 1回で記述した場合はどのようになるのかなぁと思いました。
お礼
ご返答ありがとうございます。 そのやり方でできました。ありがとうございます。 否定先読みを使わなくちゃいけない理由が なんとなくですが理解できました。