web-dev-qa-db-ja.com

PHPeregiをpreg_matchに変更する方法

重複の可能性:
PHPでereg式をpregに変換するにはどうすればよいですか?

私は助けが必要です、以下は電子メールをいくらか検証するための小さな非常に基本的な正規表現です、私はそれが最大に機能しないことを理解していますが、私のニーズには今のところ大丈夫です。

現在、PHPのeregi関数を使用していますが、php.netによると、これは減価償却された関数であり、preg_match代わりに、ereiをpreg_matchに置き換えるだけでは機能しません。誰かがそれを機能させる方法を教えてもらえますか?

function validate_email($email) {
    if (!eregi("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) {
        echo 'bad email';
    } else {
        echo 'good email';
    }
}
function validate_email($email) {
    if (!preg_match("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) {
        echo 'bad email';
    } else {
        echo 'good email';
    }
}
16
JasonDavis

Perlスタイルの正規表現パターンは常に区切る必要があります。文字列の最初の文字は区切り文字と見なされるため、次のようになります。

function validate_email($email) {
    if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", $email)) {
        echo 'bad email';
    } else {
        echo 'good email';
    }
}

最初の試行が機能しなかった理由は、区切り文字として^を使用しようとしたが、(明らかに)正規表現の終わりに一致する^が見つからなかったためです。

27
Amber

あなたは3つのことを変える必要があるでしょう

  1. パターン区切り文字を追加する必要があります(任意の文字にすることができますが、最も一般的にはスラッシュ)
  2. [[:alnum:]]は同等のPCREに置き換える必要があります
  3. 「eregi」の「i」は大文字と小文字を区別しないことを意味し、PCREはフラグ、具体的にはiフラグを使用します。

それ以外の場合、残りはPCRE互換に見えます(はい、それは一種の冗長= Pです)

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i"
10
Peter Bailey