質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

901閲覧

[cakephp3] メールアドレスのバリデーションの正規表現について

gano

総合スコア39

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

2クリップ

投稿2018/06/02 07:18

cakephp3 のメールアドレス形式を判定する
バリデーションが以下の正規表現になっておりました。

/^[\p{L}0-9!#$%&\'*+/=?^_`{|}~-]+(?:.[\p{L}0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62}).(?:(?:[a-z]{2}.)?[a-z]{2,})$/ui

おおよそ上記の正規表現の意味は理解できたのですが、
アットマークの直後にある (?:[\p{L}0-9][-\p{L}0-9].) の意味が
どうしても理解できません。

より具体的にいいますと、アンダースコア(_)が入っている理由がわかりません。

そもそもホスト名、ドメイン名にはアンダースコアが入らないと思いますし、
試しに test@_test.com のような形式で入力してみましたが、しっかりとエラーになります。

正規表現上のこのアンダースコアは何を意味するのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/02 09:18

?: ←むしろここを1個ずつ解析された方がいいかもしれません。その方面で調べてみてください。
guest

回答1

0

ベストアンサー

正規表現上のこのアンダースコアは何を意味するのでしょうか?

アンダースコアは何ら特別な意味を持たないですね。文字通りのアンダースコアです。

ここに示してある正規表現の@マーク以降は、次のようなパターンに一致するように書いてあるように見えます。

ホスト名(アンダースコア可) + ドット + ドメイン名セカンドレベル(省略可、アンダースコア不可) + ドット + ドメイン名トップレベル(アルファベット二文字以上)。ただしホスト名+ドットはなくてもいいし二つ以上続いてもいい。

私はホスト名・ドメイン名の命名規則には詳しくないのでこのコードが意図するところが正しいのか否か判断できませんが、とにかくパターンはそうなっていると思います。ちょっとググってみるとホスト名についてはアンダースコアが使えるとする記述をみつけました。しかしさらに調べると何やら相互に矛盾する記述に行き当たり、RFCの原典を精査する気力はなかったのでそっとブラウザを閉じました。

perlですが、ちょっとしたテストスクリプトを書いてみました。

perl

1 2#!/usr/bin/perl 3 4sub test1{ 5 my($t)=@_; 6 print "$t\n"; 7 $t =~ /^[\p{L}0-9!#$%&\'*+/=?^_`{|}~-]+(?:.[\p{L}0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62}).(?:(?:[a-z]{2}.)?[a-z]{2,})$/ui 8 and print "All ok\n"; 9 10 $t =~ /(?:[\p{L}0-9][-\p{L}0-9]{0,62})./ui 11 and print "ok A\n"; 12 $t =~ /@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*/ui 13 and print "ok B\n"; 14 $t =~ /@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62})./ui 15 and print "ok C\n"; 16} 17 18test1('test@hoge.page.jp'); # all OK 19test1('test@hoge._page.jp'); # NG for 2nd domain 20test1('test@_hoge.page.jp'); # all OK (_hogeはホスト名) 21test1('test@_hoge._page.jp'); # NG for 2nd domain 22test1('test@page.jp'); # all OK 23test1('test@_page.jp'); # NG for 2nd domain (_page はホスト名とは扱われない)

実行結果

test@hoge.page.jp All ok ok A ok B ok C test@hoge._page.jp ok A ok B ok C test@_hoge.page.jp All ok ok A ok B ok C test@_hoge._page.jp ok A ok B test@page.jp All ok ok A ok B ok C test@_page.jp ok A ok B

投稿2018/06/02 17:11

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gano

2018/06/05 02:57

ご回答並びにテスト等していただきありがとうございます。 また返信おそくなりまして申し訳ありません。 perlのテスト内容を読ませていただき、自分が正規表現を読み誤っていることをようやく理解できました。 test@_email.comが通らなかったので混乱していましたが、 正規表現をよく読むと test@_email.comは通らないが、test@_email.co.jpは通る という記述になっておりますね。 私もRFCの原典までたどる気力はないのですが、、自分の勘違いが解消され助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問