一回も披露したことのない豆知識

正規表現で
数値と半角記号(!#$%()~|-^@[;],./`{+*}_)が入っているというものを表現したいのですが、、、

下記のような正規表現をすると、エラーになってしまいます。何かよい方法はありませんか?
^[a-zA-Z0-9\-_!#$%()~|-^@[;],./`{+*}_]*$

又、携帯電話のチェックをしたいのですが、
1文字以上の文字列があってというような処理にしたいのですが、何かよい方法はないでしょうか?
ereg( "@docomo\.ne\.jp$", $email )

A 回答 (3件)

preg_match関数はperl互換なのでデリミタ(区切り記号)が必要です。

正規表現文字列の前後に/を入れて下さい。

preg_match("/^[a-z0-9\-\(\)\[\]\/\.\+\*\_\!\#\$\%\~\|\-\^\@\;\,\`\{\}\_]*$/i", $str )

です。その後にiを付けると大文字小文字を区別しないで検索してくれるのでA-Zは省いてあります。

エスケープは多少アバウトでも平気みたいです。
    • good
    • 1
この回答へのお礼

ありがとうございます。うまくできました。

お礼日時:2005/06/23 17:12

携帯電話のチェックですが、私は以下のようにチェックしています。



手順としては、最初にメールアドレスの形式をとっているかを調べて、そこを通過したら、@マーク以降に、携帯のアドレスが入っていないかをチェックする感じです。こなれていない部分もあるかもしれませんが、参考になればと思います。POSIX拡張正規表現の方に慣れているで、そっちを使っています。


if( !ereg("([[:alnum:]_-]+)@(.*).([[:alnum:]_-]+)",$email))
{
$error_message .= "* メールアドレスが正しくありません。<br />";
}
else if( ereg("([[:alnum:]_-]+)@(.*)",$email, $email_matches))
{
 if( ereg(".?(docomo\.ne\.jp|vodafone\.ne\.jp|ezweb\.ne\.jp)",$email_matches[2]) )
 {
  $error_message .= "* 携帯電話のメールアドレスはご利用になれません。<br />";
 }
}
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になります。

お礼日時:2005/06/23 17:12

正規表現で意味がある文字を検索文字列に使う場合はエスケープをしなければなりません。

例で言えば()-[]/.+*\などがそうです。ハイフンだけは\-としているようですので、他の文字も頭に\を付けましょう。\文字自体は\\と2つ並べます。ただ、ereg関数で\-がうまく動かない例が参考URLの質問にあります。

「一つ以上の文字列」という表現が何をしようとしているのかわからないのですが、アドレスのアカウント部分の事でしょうか。アドレスチェックであればアドレスとして使用可能な文字を1文字以上(正確にはドコモの場合3文字以上です)という事で
[a-zA-Z0-9\-_\.]+(一文字以上)
[a-zA-Z0-9\-_\.]{1,}({x,}のXの部分を変えれば任意の文字数以上)
で良いかと思います。

上記のうまく動作しない例や動作時間を考えると、可能であればpreg_match関数の方を使ったほうが良いと思います。

参考URL:http://okweb.jp/kotaeru.php3?q=1461806

この回答への補足

さっそくの回答ありがとうございます。
preg_match関数で下記のようにすると、警告がでてしまいます。。
if( !preg_match("^[a-zA-Z0-9\-\(\)\[\]\/\.\+\*\_\!\#\$\%\~\|\-\^\@\;\,\`\{\}\_]*$", $str ) ) {
処理
}

Warning: No ending delimiter '^' found

全てに対して、¥コードをつけるのは間違っていますか?

補足日時:2005/06/23 09:52
    • good
    • 0

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