下記の$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;
以上、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
if(preg_match_all("/(\w+[-+\w.]+@[-\w.]+\.\w{2,5})/",$text,$addr)){
$addr=array_unique($addr[0],SORT_STRING);
}
print_r($addr);
でどうですか。
ご回答ありがとうございます。
ご教示いただいたソースである程度意図した動作になりました。
ちなみに1点お伺いしたいのですが、ご教示いただいたメールアドレスの正規表現ですと、RFCに準拠していないメールアドレスも抽出できてしまいました。
今回下記のような正規表現は使えないのでしょうか?
http://catbot.net/blog/2007/06/re_php.html
移植できないか試してみたところ、出力結果がArrayなどになってしまい、移植できませんでした。
以上、よろしくお願いします。
No.3
- 回答日時:
そのような要件なのであれば、petitaさんが記述された構文で、大雑把なメールアドレスと取れる部分の文字列を全部抽出して、
その後に、RFCに準拠しているかどうかをチェックしたほうが良いのではないですか。
抽出をしてから、バリデーションをかけるようにしたほうが、デバッグやログもはきやすいのではないですか。
ご回答ありがとうございます。
確かにそうですね。
抽出してからチェックすれば大丈夫そうなので、その方法で対応したいと思います。
このたびはどうもありがとうございました。
以上、よろしくお願いします。
No.2
- 回答日時:
> RFCに準拠していないメールアドレスも抽出できてしまいました。
この件については承知していますが実際には、
1.RFCに準拠していても無効な場合が多々ある(プロバイダが使用できる文字・記号を制限している)
2.RFCに準拠していなくても有効な場合がある(たとえば、先頭または末尾にドットを使ったり、ドットを連続して使うのはRFCに逸脱しているが携帯では許容されている)
ですから、「RFC準拠という正規表現」でチェックすることには意味がありません。(と私としては思っています)
ご回答ありがとうございます。
本件ですが、メールアドレスを抽出した後、メールを送信する仕組みを考えており、メールの送信はできております。
なお、メール送信の仕様は下記となります。
1. RFCに準拠しないメールアドレスにはメールを送信しない
(そのためドットが連続する実在のメールアドレスにはメールを送信しません)。
2. RFCに準拠しているメールアドレスにはメールを送信する
(そのため実在しなければリターンメール?になるのかなと思っています)。
そして現在の正規表現の場合、2は(結果的に)実現できていると思うのですが、1が実現できていない状況と思われます。
実際には仕様1のメールに送信しようとするのですが、メール送信の際、RFC非対応という事で結局相手には届かない為、届かないという現実は変わらないのですが、現在は送信動作実施→送信失敗になると思われるのに対し、メールアドレスの抽出自体を抑止することで、送信動作実施→送信失敗を抑止できた方が好ましいなと思いました。
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数の一致条件がたくさんある...
-
一致しないデータも表示させたい
-
数独かを判断するプログラム
-
STLのvectorで作った配列をメン...
-
C言語の配列をPush(追加)する...
-
Arrayを並びかえる!?
-
Perlで重複行を削除したい
-
$_SESSIONに二次元配列を使える...
-
pdfファイルの複数添付 引数の型
-
NGワード設定もしくはテキス...
-
別ファイルの構造体の値を読み...
-
Resource id #3 と表示されま...
-
sqlのデーターを『あ行』『か行...
-
SimpleXML関数で取得したXML要...
-
file_get_contents()にて文字化け
-
添え字が全て文字列のPHPの多次...
-
phpでcsvを読み込むときのdata...
-
PHPで配列をPOSTデータで送った...
-
file_existsでファイル名の部分...
-
配列をループでたくさん宣言し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
CArrayの要素としてCStringArra...
-
verilogで、配列の一部をタスク...
-
System.String.Splitでエラー
-
Perlで重複行を削除したい
-
行列
-
スカラーのベクトル微分
-
C言語 最大値と最小値を求めて...
-
PHPで2次元配列を1次元配列に...
-
mallocで char *型の配列を確...
-
array_intersectで空欄を比較し...
-
am()の使い方
-
数独かを判断するプログラム
-
複数のforeachをまとめるには
-
ソートの名称について
-
PHPのmin関数、「1」以上の数値...
おすすめ情報