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

このQ&Aのポイント
  • 下記のテキストからメールアドレスのみを抽出し、配列に格納する方法についてアドバイスをいただきたいです。
  • また、重複するメールアドレスは一つにまとめる必要があります。
  • 抽出したメールアドレスは、配列$arrayに格納していきます。
回答を見る
  • ベストアンサー

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

下記の$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; 以上、よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • petita
  • ベストアンサー率53% (8/15)
回答No.1

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

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご教示いただいたソースである程度意図した動作になりました。 ちなみに1点お伺いしたいのですが、ご教示いただいたメールアドレスの正規表現ですと、RFCに準拠していないメールアドレスも抽出できてしまいました。 今回下記のような正規表現は使えないのでしょうか? http://catbot.net/blog/2007/06/re_php.html 移植できないか試してみたところ、出力結果がArrayなどになってしまい、移植できませんでした。 以上、よろしくお願いします。

その他の回答 (2)

回答No.3

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

iroha_168
質問者

お礼

ご回答ありがとうございます。 確かにそうですね。 抽出してからチェックすれば大丈夫そうなので、その方法で対応したいと思います。 このたびはどうもありがとうございました。 以上、よろしくお願いします。

  • petita
  • ベストアンサー率53% (8/15)
回答No.2

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

iroha_168
質問者

お礼

ご回答ありがとうございます。 本件ですが、メールアドレスを抽出した後、メールを送信する仕組みを考えており、メールの送信はできております。 なお、メール送信の仕様は下記となります。 1. RFCに準拠しないメールアドレスにはメールを送信しない (そのためドットが連続する実在のメールアドレスにはメールを送信しません)。 2. RFCに準拠しているメールアドレスにはメールを送信する (そのため実在しなければリターンメール?になるのかなと思っています)。 そして現在の正規表現の場合、2は(結果的に)実現できていると思うのですが、1が実現できていない状況と思われます。 実際には仕様1のメールに送信しようとするのですが、メール送信の際、RFC非対応という事で結局相手には届かない為、届かないという現実は変わらないのですが、現在は送信動作実施→送信失敗になると思われるのに対し、メールアドレスの抽出自体を抑止することで、送信動作実施→送信失敗を抑止できた方が好ましいなと思いました。 以上、よろしくお願いします。

関連するQ&A

  • 入力されたテキストからメールアドレス抽出するPHP

    入力されたテキストからメールアドレス抽出するPHPを作りたいのですが、下記の記述では抽出ができません。 どのように文を変えたら抽出できるでしょうか?よろしくお願い致します。 <form action="mail2.php" method="post"> <input type="text" name="text" size="100" value=""/><br /> <input type="submit" name="text" value="テキストからアドレスを抜き出す" /> </form> <?php if( preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",$text,$match)); echo "アドレス-> {$match[0]}\n"; print $arr_str[0];  ?>

    • ベストアンサー
    • PHP
  • メールサーバー⇒アドレス抽出

    下記のようにメールサーバーにアクセスし、アドレスを抽出しようと思ったのですが思い通りに値が帰ってきません。タイトルは正常に抽出できたのですが、アドレスはどうもうまくいきません。致命的なミスはないと思うのですがどこが間違っているのでしょうか… 宜しくお願いします。 function check_mail($login_id, $login_pwd, $host) { //戻り値生成 $ret = array(); ・・・途中省略・・・ /* 送信者アドレスの抽出 */ if (eregi("From:[ \t]*([^\r\n]+)", $head, $freg)) { $from = addr_search($freg[1]); } elseif (eregi("Reply-To:[ \t]*([^\r\n]+)", $head, $freg)) { $from = addr_search($freg[1]); } elseif (eregi("Return-Path:[ \t]*([^\r\n]+)", $head, $freg)) {  $from = addr_search($freg[1]); } */ //アドレスを格納 $ret[] = $from; 途中省略 ----------- /* メールアドレスを抽出する */ function addr_search($addr) { if (eregi("[-!#$%&\'*+\\./0-9A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+", $addr, $fromreg)) { return $fromreg[0]; } else { return false; } }

    • ベストアンサー
    • PHP
  • 2つの連想配列を比較して一致するものを出力

    下記のような連想配列が2つあります。 それらの配列の3つ目の電話番号(070-0000-000等)のみを比較して一致する連想配列を配列にして出力するようなプログラムを考えています。 連想配列同士を比較する方法が見つからなかったため、どのように書いたら良いのかわかりません。 ご教授お願い致します。 【既存の連想配列】 <?php $first = array(     'test_1' => array(         0 => '山田太郎',         1 => 'ヤマダタロウ',         2 => '090-0000-0000',     ),     'test_2' => array(         0 => '田中次郎',         1 => 'タナカジロウ',         2 => '080-0000-0000',     ),     'test_3' => array(         0 => '佐藤三郎',         1 => 'サトウサブロウ',         2 => '070-0000-0000',     ), ); $second = array(     'test_1' => array(         0 => '鈴木四郎',         1 => 'スズキシロウ',         2 => '050-0000-0000',     ),     'test_2' => array(         0 => '佐藤五郎',         1 => 'サトウサブロウ',         2 => '070-0000-0000',     ),     'test_3' => array(         0 => '安藤六郎',         1 => 'アンドウロクロウ',         2 => '000-0000-0000',     ), ); ?> 【比較後の配列(例)】 $result //に結果を格納 この$resultの中身は、 array('佐藤五郎','サトウサブロウ','070-0000-0000'); のような感じです。

    • ベストアンサー
    • PHP
  • 文字列を分解して配列に格納する方法について

    下記の変更前の文字列を、変更後のようにしたいと思ったのですが、どのようにすればそのような事ができるのかわからなかったので、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 <?php // 変更前 $string = "名前1 <メールアドレス1>,メールアドレス2, 名前3<メールアドレス3>"; // 変更後 $array[0][0] = "名前1" $array[0][1] = "メールアドレス1" $array[1][0] = "空白(もしくはメールアドレス2)" $array[1][1] = "メールアドレス2" $array[2][0] = "名前3" $array[2][1] = "メールアドレス3" ?> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列の中に重複文字列があるか否かをチェックしたいのですが、アルゴリズムを教えてください。

    配列10000個の中に次のように文字列が入っているとします。 (実際に使うのはもっとずっと長い文字列が配列内に格納されています。) Data_Array[1] = "GRZRMZCOMKMSG" Data_Array[2] = "DCUIROTLUMWBC" Data_Array[3] = "RGLBMILRPBSMY" . . . Data_Array[9998] = "RSKFDHAHMOESI" Data_Array[9999] = "AQVOXBVNILGOP" Data_Array[10000] = "YNYRUPEXYOGFN" 配列Data_Array[10000]の中に重複文字列がないか探索したいと考えています。 ~普段の手順~ 配列中身を一度テキストに吐き出し、そのテキストをExcelに貼り付ける。 そして、Excelのフィルタ機能で重複文字列を排除。 その後、重複文字列を排除した文字列を保存したものをテキストファイルに保存する。 それをプログラムで読み込んで配列内に格納してから次の処理を続ける といった、効率の悪い方法をとっています。 そこで、プログラム内で処理する方法を次のように考えてみました。 ~思いつく方法~ dim DataArrayTemp[10000] for i = 1 to 10000 flag = 0 // 重複文字がないかチェック for j = i+1 to 10000 ifb Data_Array[i] = Data_Array[j] then // 重複があった場合はflag = 1にする flag = 1 break // 内ループ脱出 endif next // flag = 0であれば重複がない項目 (flag = 1のときは、重複がある) ifb flag = 0 then DataArrayTemp[temp_i] = Data_Array[i] temp_i = temp_i + 1 endif next これは、力技なので配列内の量が多くなると計算時間がかかってしまいます。 ですので、重複しない文字列だけを抽出する効率の良い方法がありましたらどなたか知恵を貸してください。

  • カンマで区切られたメールアドレスを配列に格納したい場合

    いつもお世話になっております。 下記のようなStringのデータを配列に格納したいのですが、 private static final String MAILS = "test1@test.com,tes,t2@tes,t.net,test3@te,st.jp"; 普通にカンマで分割するとメールアドレスの形式はめちゃくちゃで配列に格納されてしまいます。 StringTokenizer st = new StringTokenizer(MAILS, ","); String [] mailList = new String[st.countTokens()]; int i = 0; while (st.hasMoreTokens()) { mailList[i] = st.nextToken(); i++; } test1@test.com tes,t2@tes,t.net test3@te,st.jp 上記のようにちゃんとしたメールの形式で配列に格納するにはどうすればいいでしょうか? ご教授頂ければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 文字列と文字列をつなげるには

    下記のようにプログラムを作りました。 簡略しているのでわかりづらいと思いますが、 文字の配列と文字の配列を文字の配列に格納したいので、 下記のように$arrayに”.=”として文字列を加えて いますが、うまくいきません。 どのようにしたらいいのでしょうか? ご教授お願いいたします。 while($text[$i] != ""){ if($i==1){ $array[$j] = $feild[$j]; $array[$j] .= " "; $array[$j] .= substr($text[$i], $no, $pos); } }

    • ベストアンサー
    • PHP
  • 他の人にアドレスが見えないようにする送信方法は・・・?

    いつも大変お世話になっております。 今SQLより抽出したアドレスに一括してメールを送信するプログラムを作っています。 最終的に送信のプログラムは、下記の通りです。 $to = $_POST['mail']; $subject = $_POST['subject']; $body = $_POST['message']; $from = "送信者"."<アドレス>"; mb_send_mail($to,$subject,$body,"From:".$from); しかしながら$_POST['mail'];は配列で格納しているためカンマ区切りのアドレスとなっています。 (aaa@yahoo.co.jp,bbb@yahoo.co.jp・・・) 実際テストしたところ宛先にすべてのアドレスが表示されてしまいました(x_x;) どうにか他の人のアドレスまで表示させないようにはできないでしょうか? あと素朴な疑問なのですが、送信した際、不達となったメールデータはどこにいっているのでしょうか? サーバーのどこかに格納、または送信者に返ってくる、もしくは不達のメッセージは自動でサーバーが削除しているのでしょうか? サーバーはチカッパ!を利用しています。 何卒よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • ある文字を含む文字列のみ配列にする方法

    var_dump($text); を行うと array(1) { [0]=> string(XX) "あいさつ" } array(1) { [0]=> string(XX) "いい日旅立ち" } array(1) { [0]=> string(XX) "りんご、うまい" } array(1) { [0]=> string(XX) "メロン好き" } …… となるような変数 $text があり、そこから $key = array("ばなな","りんご","メロン"); の配列内にある文字列を含むものだけを新たに格納したいです。 自分では foreach($text as $value){ if(in_array($value, $key)){ $key_text[] = $value; } } と書いて試したのですが、NULLと返ってきてしまいます。 どうやって書けばいいか教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP

専門家に質問してみよう