20

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

ヘルプが必要です。以下は、電子メールをある程度検証するための非常に基本的な小さな正規表現です。これはうまく機能しないことはわかっていますが、私のニーズには今のところ問題ありません。

現在、php.netが減価償却された関数であると言っているPHPのeregi関数を使用しているので、代わりに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';
    }
}
4

2 に答える 2

32

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';
    }
}

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

于 2009-09-03T17:45:07.813 に答える
10

あなたは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"
于 2009-09-03T17:49:16.290 に答える