アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP5.2.4を使用しています。

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

A 回答 (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」は許可しない
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/23 04:30

> if (preg_match("/[^(ab)][a-z0-9]+/", $str)) {


文字クラスは一文字の否定しかできないので、[^(ab)] は意図通りに働きません。
文字列を否定する場合は否定先読みを使います。
それと、^$ がないと部分一致になってしまいますね。

if (preg_match("/^(?:(?!ab)[a-z0-9])+$/", $str)) {

# 未テストですが、上記コードをベースにすれば動くと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/22 22:45

言葉で表現したとおり、条件指定してみては?



> 1文字以上のアルファベットと数字の組み合わせは許可
preg_match("/^[a-z0-9]+$/", $str)

> かつ
&&

> 「ab」は許可しない
! preg_match("/^ab$/", $str)
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/22 16:17

無理に1回の正規表現マッチングでやろうとせず、ifと組み合わせて、複数条


件でチェックした方が、結局早道で確実だったりします。
例えばまず、
1文字以上のアルファベットと数字の組み合わせかをチェックして
OKだったらabかどうかをチェックすればよいのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/10/22 16:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!