0

次のいずれかのように、メールアドレスに一致する正規表現を作成しようとしています:

example@website.com
first.last@website.org
joe87_smith@web.net

私はこの正規表現を書きました:

$pattern = "/[\-\.\_a-z0-9]+(\@){1}[\-\.\_a-zA-Z0-9]+(\.){1}[\-a-z0-9]+/i";

そして、これをテストするために使用しているコードを次に示します。

$str = "test_last@test.com was the email address associated with another one, another.test@other.org";
$pattern = "/[\-\.\_a-z0-9]+(\@){1}[\-\.\_a-zA-Z0-9]+(\.){1}[\-a-z0-9]+/i";
preg_match_all($pattern, $str, $matches);
var_dump($matches);

(メール間のテキストはフィラーです)次のようにすることになっています:

  1. 1 つ以上のピリオド、ダッシュ、アンダースコア、または英数字を含むことができるユーザー名を確認してください。
  2. 1 つだけ (必須) の「@」記号を確認してください。
  3. ドメインまたは任意の数のサブドメインを確認します (英数字 + ピリオド + ダッシュ)
  4. ピリオドの後に英数字またはダッシュ文字が続くことを確認します。

上記のコードをテストすると、次の出力が得られます。

array(3) {
    [0] => array(2) {
        [0] => string(22) "test_last@test.com was"
        [1] => string(22) "another.test@other.org"
    }
    [1] => array(2) {
        [0] => string(1) "@"
        [1] => string(1) "@"
    }
    [2] => array(2) {
        [0] => string(1) " "
        [1] => string(1) "r"
    }
 }

単一の @ 記号や文字 "r" など、他の多くの文字と一致するのはなぜですか? 最初のメールに was という単語が含まれているのはなぜですか? 私の知る限り、スペースをテストしたことはありません...

4

3 に答える 3

1

コメントからの質問に答えます。問題は、正規表現内でグループを使用していたことです。つまりpreg_match_all、これらのグループでも個別に一致していました。

正規表現を次のように変更します。

/[\-\.\_a-z0-9]+[\@]{1}[\-\.\_a-zA-Z0-9]+[\.]{1}[\-a-z0-9]+/

戻ってきた:

Array
(
    [0] => Array
        (
            [0] => test_last@test.com
            [1] => another.test@other.org
        )

)

OP テスト テキストの使用。

于 2012-08-16T07:35:56.133 に答える
0

電子メール アドレスの検証 (regexp などを使用) には問題があります。こちらを参照してください:正規表現を使用して電子メール アドレスを検証する.

于 2012-08-16T08:37:03.753 に答える
0

PHP has built in filters to check for things like e-mail validity now. More specifically, you might want to look into filter_var() and the FILTER_VALIDATE_EMAIL filter.

Sample usage:

$valid_email = filter_var($email, FILTER_VALIDATE_EMAIL);
if($valid_email)
        echo "Hooray!";

All three of your sample e-mail addresses should return the "hooray!"

于 2012-08-16T07:16:30.700 に答える