• ベストアンサー

正規表現

正規表現で 数値と半角記号(!#$%()~|-^@[;],./`{+*}_)が入っているというものを表現したいのですが、、、 下記のような正規表現をすると、エラーになってしまいます。何かよい方法はありませんか? ^[a-zA-Z0-9\-_!#$%()~|-^@[;],./`{+*}_]*$ 又、携帯電話のチェックをしたいのですが、 1文字以上の文字列があってというような処理にしたいのですが、何かよい方法はないでしょうか? ereg( "@docomo\.ne\.jp$", $email )

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

  • ベストアンサー
回答No.2

preg_match関数はperl互換なのでデリミタ(区切り記号)が必要です。正規表現文字列の前後に/を入れて下さい。 preg_match("/^[a-z0-9\-\(\)\[\]\/\.\+\*\_\!\#\$\%\~\|\-\^\@\;\,\`\{\}\_]*$/i", $str ) です。その後にiを付けると大文字小文字を区別しないで検索してくれるのでA-Zは省いてあります。 エスケープは多少アバウトでも平気みたいです。

aiurai54
質問者

お礼

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

その他の回答 (2)

回答No.3

携帯電話のチェックですが、私は以下のようにチェックしています。 手順としては、最初にメールアドレスの形式をとっているかを調べて、そこを通過したら、@マーク以降に、携帯のアドレスが入っていないかをチェックする感じです。こなれていない部分もあるかもしれませんが、参考になればと思います。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 />";  } }

aiurai54
質問者

お礼

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

回答No.1

正規表現で意味がある文字を検索文字列に使う場合はエスケープをしなければなりません。例で言えば()-[]/.+*\などがそうです。ハイフンだけは\-としているようですので、他の文字も頭に\を付けましょう。\文字自体は\\と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
aiurai54
質問者

補足

さっそくの回答ありがとうございます。 preg_match関数で下記のようにすると、警告がでてしまいます。。 if( !preg_match("^[a-zA-Z0-9\-\(\)\[\]\/\.\+\*\_\!\#\$\%\~\|\-\^\@\;\,\`\{\}\_]*$", $str ) ) { 処理 } Warning: No ending delimiter '^' found 全てに対して、¥コードをつけるのは間違っていますか?