• ベストアンサー

正規表現について

PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.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」は許可しない

takagoo100
質問者

お礼

ご返答ありがとうございます。 そのやり方でできました。ありがとうございます。 否定先読みを使わなくちゃいけない理由が なんとなくですが理解できました。

その他の回答 (3)

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

> if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { 文字クラスは一文字の否定しかできないので、[^(ab)] は意図通りに働きません。 文字列を否定する場合は否定先読みを使います。 それと、^$ がないと部分一致になってしまいますね。 if (preg_match("/^(?:(?!ab)[a-z0-9])+$/", $str)) { # 未テストですが、上記コードをベースにすれば動くと思います。

takagoo100
質問者

お礼

ご返答ありがとうございます。 $str = "abc";で試してみたのですが駄目でした・・・ ベースにすればとあるのですが、どこか記述を変える必要があるのでしょうか?

回答No.2

言葉で表現したとおり、条件指定してみては? > 1文字以上のアルファベットと数字の組み合わせは許可 preg_match("/^[a-z0-9]+$/", $str) > かつ && > 「ab」は許可しない ! preg_match("/^ab$/", $str)

takagoo100
質問者

お礼

ご返答ありがとうございます。 たしかに2回に分けた方が分かりやすいですね。

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

無理に1回の正規表現マッチングでやろうとせず、ifと組み合わせて、複数条 件でチェックした方が、結局早道で確実だったりします。 例えばまず、 1文字以上のアルファベットと数字の組み合わせかをチェックして OKだったらabかどうかをチェックすればよいのでは?

takagoo100
質問者

お礼

ご返答ありがとうございます。 たしかにそのやり方が良いのだと思いますが、 1回で記述した場合はどのようになるのかなぁと思いました。

関連するQ&A

専門家に質問してみよう