スレッド表示 | フラット表示〕 全トピック 920 件中 435 番目 次≫ ≪前

メールフォーマットのチェック

created: 2005-05-26 19:28 | modified: 2005-06-01 13:12 | reply: 8

[2275] メールフォーマットのチェック

user: monmon | created: 2005-05-26 19:28
今、メールフォームのメールアドレスの妥当性を判定するプログラムを作成しています。
(勉強です)

今回の条件は

・@が一つだけ含まれている
・@は先頭にも末尾にもあってはならない

この二つだけです。

@が一つだけ含まれているときにエラーを出すプログラムは、

if(!preg_match("/@/",$email)){
echo "@が一つも含まれません"
}

でOKだったのですが、
もうひとつの

・@は先頭にも末尾にもあってはならない

の記述の仕方がわかりません。

@を基準に全後を切り離すsplitを使うのはわかるのですが、その後の処理はどうすればよいのでしょうか。

是非お力いただけませんでしょうか。
よろしくお願い致します。
reply: 2282 返信 編集 削除

[2282] Re: メールフォーマットのチェック

user: サガ | created: 2005-05-28 08:53
if (!preg_match("/@{1}/", $email)) {
echo "@が一つ以上又は一つも含まれていません";
}

if (!preg_match("/^@|@$/", $email)) {
echo "@が先頭又は末尾にあります";
}

でもこれだけだとあまり効果的ではないので、他にも.(ドット)の数や英数字の有効性などもチェックするようにするといいと思います。
Parent: 2275  reply: 2283 返信 編集 削除

[2283] Re: メールフォーマットのチェック

user: サガ | created: 2005-05-28 08:56
ミスりました。正しくはこうです。
if (!preg_match("/@/", $email) || preg_match("/@{2,}/", $email)) {
echo "@が一つ以上又は一つも含まれていません";
}
if (preg_match("/^@|@$/", $email)) {
echo "@が先頭又は末尾にあります";
}
Parent: 2282  reply: 2287 返信 編集 削除

[2287] @が離れて2回以上

user: | created: 2005-05-28 23:17
こんにちは。
割り込みで失礼します。

preg_match("/@{2,}/", $email)

だと、
test@@test.ne.jp
はチェック出来ますが、
test@a@test.ne.jp
(@が離れた位置に2つ以上ある)は通ってしまいますね。

その部分は、

preg_match("/@.?@/", $email)

こんな感じでどうでしょう。
Parent: 2283  reply: 2290 返信 編集 削除

[2290] 動作確認できました

user: monmon | created: 2005-05-30 11:06
サガさん、箱さんありがとうございます。

無事サーバーでの動作が確認できました。
こういう方法があったんですね。

一点、下記の部分での解説が欲しいのですが


if (!preg_match("/@/",$email)||preg_match("/@.?@/",$email)) {

</cordf>

//@を一つも含まない
if (!preg_match("/@/",$email)

これ以下の、

||preg_match("/@.?@/",$email)) {

の部分ですが、先頭の「||」、これはメタ文字でいうパターン論理和のことですよね。2文字書くのはなぜですか?2つのpreg_matchをつなげるためなのかなと思いましたが。。。

さらにここの部分は

"/@.?@/"

意味をそのまま言葉にすると、

1つの@とそれ以外の@が0または1回出現する、の解釈でよろしいでしょうか。
考え方として間違っていましたらご指摘お願いいたします。

どうぞよろしくお願いします。
Parent: 2287  reply: 2291 返信 編集 削除

[2291] ごめんなさい、間違ってました

user: | created: 2005-05-30 13:14
すみません、間違ってました…!

preg_match("/@.?@/",$email)

じゃなくて、

preg_match("/@.*@/",$email)

でした。

--------------------

> ||preg_match("/@.?@/",$email)) {
> の部分ですが、先頭の「||」、これはメタ文字でいうパターン論理和の
> ことですよね。2文字書くのはなぜですか?

この「||」は、正規表現のための理論和演算子ではなく、if文のために
書かれた理論和演算子です。

--------------------

> "/@.?@/"
> 意味をそのまま言葉にすると、
> 1つの@とそれ以外の@が0または1回出現する、の解釈でよろしいでしょうか。

私が書こうとしていたのは、"/@.*@/"でした。御免なさい。

"/@.*@/"で説明すると、意味としては、
「@」+「任意の文字の0回以上の繰り返し」+「@」
という文字列にマッチ、ということです。例えば、

「abc@@def」
「abc@@@@def」
「abc@d@efg」
「abc@def@ghi」
「abc@d@efg@hij」

などがマッチします。
Parent: 2290  reply: 2292 返信 編集 削除

[2292] Re.ごめんなさい、間違ってました

user: monmon | created: 2005-05-30 15:34
> この「||」は、正規表現のための理論和演算子ではなく、if文のために
> 書かれた理論和演算子です。

なるほど・・。そうでしたか。
if文にも論理和演算子があったのですね。


> "/@.*@/"で説明すると、意味としては、
> 「@」+「任意の文字の0回以上の繰り返し」+「@」
> という文字列にマッチ、ということです。例えば、
>
> 「abc@@def」
> 「abc@@@@def」
> 「abc@d@efg」
> 「abc@def@ghi」
> 「abc@d@efg@hij」
>
> などがマッチします。

わかりやすく説明してくださってありがとうございました。
納得!です。

次にやろうとしていることは、

1.@の後ろのドメイン部分には、ピリオドが含まれているはずである。

if(preg_match("/@.*[\.]/",$email))
echo "OK";
}else{
echo "@の後ろのドメイン部分にはピリオドが含まれていません。"
}

2.ドメイン部分において、ピリオドは先頭にも末尾にもあってはならない


if(preg_match("/^[\.]|[\.]$/",$email))
echo "OK";
}else{
echo "ドメイン部分にピリオドが先頭または末尾にあります。"
}


とりあえず、ここまで出来ました。
これで問題ないでしょうか。
よろしくお願い致します。
Parent: 2291  reply: 2295 返信 編集 削除

[2295] 関数にする

user: monmon | created: 2005-06-01 10:43
こんにちは。

最初の条件である

・@が一つだけ含まれている
・@は先頭にも末尾にもあってはならない

この2点を関数にすると

function mailcheck($email){
if (!preg_match("/^@|@$,@.*@/"))
return TRUE;
else return FALSE;
}

というような形になると思うんですが
これだと、・@が一つだけ含まれているの部分のチェックが出来ないのです。
・@は先頭にも末尾にもあってはならないの部分は出来るんですが・・・。

どなたか教えてください。
よろしくお願い致します。
Parent: 2292  reply: 2296 返信 編集 削除

[2296] 関数にすると

user: monmon | created: 2005-06-01 13:12
こうやったらできました。

function mailcheck($email){
if (!preg_match("/^[^@]+@[^@]+$/"))
return TRUE;
else return FALSE;
}
Parent: 2295  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 435 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑