ここから本文です

正規表現にて、 「先頭文字がa~zから必ず1文字 2文字目以降はa~zまたは0~9の中...

yam********さん

2018/1/100:00:55

正規表現にて、
「先頭文字がa~zから必ず1文字
2文字目以降はa~zまたは0~9の中から1文字以上の繰り返し
”@”記号を挟んで

a~zを1文字以上繰り返した後、a~zまたは"-"または”.” の中から1文字以上を繰り返す」

を表したいのですが、

"/^([a-z])([a-z0-9])+@([a-z])+([a-z-.]+)+$/"

これは間違っているのでしょうか?コードを書いて試したところ、@の前が、

11111

でも通ってしまいます。先頭文字が、a~zから必ず1文字選ばれなければならないようにするには、どう書くのが正しいのでしょうか。分かる方がいたら教えていただきたいです。

補足PHPを用いています。

閲覧数:
80
回答数:
5
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

mpywさん

2018/1/204:12:45

もし目的がメールアドレスのバリデーションであれば,filter_var関数を使ってください。PHP7.1以降ではこれ以外の選択肢は最適解ではありません。

PHPで各種バリデーション - Qiita
https://qiita.com/mpyw/items/346f1789ad0e1b969ebc

最もおすすめする実装↓

function is_valid_email($email, $check_dns = false)
{
    switch (true) {
        case false === filter_var($email, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE):
        case !preg_match('/@(?!\[)(.++)\z/', $email, $m):
            return false;

        case !$check_dns:
        case checkdnsrr($m[1], 'MX'):
        case checkdnsrr($m[1], 'A'):
        case checkdnsrr($m[1], 'AAAA'):
            return true;

        default:
            return false;
    }
}

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

tezcelloさん

2018/1/115:28:49

> @の前が、
> 11111
> でも通ってしまいます
当方で試した範囲では、その様に事にはなりません。

a11111@abcde

なら、マッチしますが...

質問する際は、問題を再現できる最小限のソースとデータを付けると、解決が早いはずです。

最小限のソースとデータを提示する際に試すでしょうから、「正規表現だと思ったら別のところでミスっていた」なんてのも質問する前に解決します。


> [a-z-.]
z の後ろのハイフンは、「範囲」を示す文字としては解釈されない位置にある(直前が範囲の最後であるから)と思われるのでエラーにはなりませんが、読み間違いを無くすためにも
[a-z.-] や [a-z\-.] の方が良い様に思います。


> ^([a-z])([a-z0-9])+@([a-z])+([a-z-.]+)+$
丸括弧でたくさん括っていますが、必要なんでしょうか?
必要だとしても、こう言う事なんじゃないかと...
^([a-z])([a-z0-9]+)@([a-z]+)([a-z-.]+)+$

必要でなければ、こうだろうと...
^[a-z][a-z0-9]+@[a-z]+(?:[a-z-.]+)+$


また後半の部分も、メールアドレスのドメイン的なモノを想定しているのなら、想定外のものまでマッチしてしまいます。
__上記の a11111@abcde の様に



kazmi65536さんの仰る
> それだと
> 1111@1111
> a11@aa
> みたいな複数行のデータで1行でも合致
というのは間違っていると思います。

質問者さんが提示された正規表現中には改行文字にマッチする部分がありません。
また「任意の一文字」を表す . も無いので s 修飾子を指定したとしても改行文字にマッチしません。
__文字クラス内の . はメタ文字としての意味を無くすので
__文字通り . にしかマッチしません


prwussさんご提示のリンク先にもあるように、メールアドレスの正規表現は「なんちゃって」以外は無理ですよね。
なので、filter関数でチェックするのが現実的だと思います。
__ただし 某キャリアの RFC違反なメールアドレスも拒否
__すると思うので、それらは別途対応が必要

「PHP使いはもう正規表現をblogに書くな」に対しては、『PHPに限らないだろ』と思いますけどね。
正規表現は奥が深く、正直難しいです。
ですが他の言語に対して敷居の低いPHPは学習の浅い者が多い可能性が高いので、正規表現をチャンと検証できずに丸呑みをしてしまい、見聞きしたモノをついつい自慢したくなるのでしょう。
__それなりに知名度のある入門サイト的なところでも
__それに陥っている点で闇は深いですが...

prwssさん

2018/1/100:57:49

>”@”記号を挟んで

この辺りを読めばいいんじゃないスかね


404 Blog Not Found:「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
http://blog.livedoor.jp/dankogai/archives/51189905.html

kaz********さん

2018/1/100:42:52

それだと
1111@1111
a11@aa
みたいな複数行のデータで1行でも合致していると通ってしまいます。
(そんなデータをpreg_matchに投げること自体が間違ってる気もしますけど)
^$ではなく\A\zにするべきかと

プロフィール画像

カテゴリマスター

nora1962****さん

2018/1/100:18:25

preg_match
ですか、実際にどんな文字列に対して、どんな判定をしているのでしょうか。
可能なら
> コードを書いて試したところ、@の前が、
> 11111
> でも通ってしまいます。

というコードをサンプルでいいので示してください。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる