こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

特定の文からメールアドレスのみ抽出する方法

下記の$text内の文章からメールアドレスのみ抽出し、配列に格納したいと思ったのですが、どのようにすればそのような事ができるのかわからなかったので、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。

<?php
$text = <<<END
"test1@test.co.jp"
"test2@test.co.jp" <test2@test.co.jp>
テスト
test3@test.co.jp
END;
?>

なお、重複するメールアドレスは一つにまとめたいので、上記の場合、下記の値を取得したいと思います。

$array[0] = test1@test.co.jp;
$array[1] = test2@test.co.jp;
$array[2] = test3@test.co.jp;

以上、よろしくお願いします。

投稿日時 - 2010-12-30 18:02:04

QNo.6416226

困ってます

質問者が選んだベストアンサー

if(preg_match_all("/(\w+[-+\w.]+@[-\w.]+\.\w{2,5})/",$text,$addr)){
$addr=array_unique($addr[0],SORT_STRING);
}
print_r($addr);

でどうですか。

投稿日時 - 2010-12-31 12:02:43

お礼

ご回答ありがとうございます。
ご教示いただいたソースである程度意図した動作になりました。

ちなみに1点お伺いしたいのですが、ご教示いただいたメールアドレスの正規表現ですと、RFCに準拠していないメールアドレスも抽出できてしまいました。

今回下記のような正規表現は使えないのでしょうか?
http://catbot.net/blog/2007/06/re_php.html

移植できないか試してみたところ、出力結果がArrayなどになってしまい、移植できませんでした。

以上、よろしくお願いします。

投稿日時 - 2010-12-31 14:07:58

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

そのような要件なのであれば、petitaさんが記述された構文で、大雑把なメールアドレスと取れる部分の文字列を全部抽出して、
その後に、RFCに準拠しているかどうかをチェックしたほうが良いのではないですか。

抽出をしてから、バリデーションをかけるようにしたほうが、デバッグやログもはきやすいのではないですか。

投稿日時 - 2011-01-03 04:00:46

お礼

ご回答ありがとうございます。

確かにそうですね。
抽出してからチェックすれば大丈夫そうなので、その方法で対応したいと思います。

このたびはどうもありがとうございました。

以上、よろしくお願いします。

投稿日時 - 2011-01-04 21:33:42

ANo.2

> RFCに準拠していないメールアドレスも抽出できてしまいました。

この件については承知していますが実際には、
1.RFCに準拠していても無効な場合が多々ある(プロバイダが使用できる文字・記号を制限している)
2.RFCに準拠していなくても有効な場合がある(たとえば、先頭または末尾にドットを使ったり、ドットを連続して使うのはRFCに逸脱しているが携帯では許容されている)
ですから、「RFC準拠という正規表現」でチェックすることには意味がありません。(と私としては思っています)

投稿日時 - 2011-01-01 09:33:53

お礼

ご回答ありがとうございます。

本件ですが、メールアドレスを抽出した後、メールを送信する仕組みを考えており、メールの送信はできております。

なお、メール送信の仕様は下記となります。
1. RFCに準拠しないメールアドレスにはメールを送信しない
(そのためドットが連続する実在のメールアドレスにはメールを送信しません)。
2. RFCに準拠しているメールアドレスにはメールを送信する
(そのため実在しなければリターンメール?になるのかなと思っています)。

そして現在の正規表現の場合、2は(結果的に)実現できていると思うのですが、1が実現できていない状況と思われます。
実際には仕様1のメールに送信しようとするのですが、メール送信の際、RFC非対応という事で結局相手には届かない為、届かないという現実は変わらないのですが、現在は送信動作実施→送信失敗になると思われるのに対し、メールアドレスの抽出自体を抑止することで、送信動作実施→送信失敗を抑止できた方が好ましいなと思いました。

以上、よろしくお願いします。

投稿日時 - 2011-01-01 14:53:05

あなたにオススメの質問