phpで正規化を使用して名前、Mailアドレスを分割格納を行いたいです。サンプルコードを教えてください。

対象文字列は、
"名前1"<aaa1@bbb1.com>,"名前2"<aaa2@bbb2.com>
です

回答の条件
  • URL必須
  • 1人1回まで
  • 13歳以上
  • 登録:2010/10/03 14:56:23
  • 終了:2010/10/10 15:00:04

回答(3件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492010/10/03 15:39:43

ポイント27pt

サンプル

<?php
$text = "\"名前1\"<aaa1@bbb1.com>,\"名前2\"<aaa2@bbb2.com>";
if ( preg_match_all( '!"(.+?)"<(.+?)>!s', $text, $mailAddressArray ) ) {
    $n = count( $mailAddressArray[0] );
    for( $i = 0; $i < $n; $i++ ) {
        echo $mailAddressArray[1][$i] . ' : ' . $mailAddressArray[2][$i] . "<br />\n";
    }
} else {
    echo 'マッチしませんでした';
}

実行結果

名前1 : aaa1@bbb1.com
名前2 : aaa2@bbb2.com

http://php.net/manual/ja/function.preg-match-all.php

id:kirara_namazu

ありがとうございます。splitが5.3では非推奨です。なにか変わりがありませんか

2010/10/03 15:57:55
id:HowAreYou No.2

HowAreYou回答回数91ベストアンサー獲得回数172010/10/03 15:30:47

ポイント27pt

分割格納というのがどういう形式なのか分かりませんが、一例として。

<?php
$str = <<<ENDSTR
"名前1"<aaa1@bbb1.com>,"名前2"<aaa2@bbb2.com>,"名前3"<aaa3@bbb3.com>
ENDSTR;

$list = array() ;

foreach (split(',', $str) as $k => $v) {
  preg_match('/"(.*?)"<(.*?)>/', $v, $m) ;
  $list[] = array($m[1], $m[2]) ;
}

print_r($list) ;

http://q.hatena.ne.jp/

id:kirara_namazu

ありがとうございます。

$strに,aaa4@bbb4.com,が混ざっていても取れるようにできないでしょうか

2010/10/03 15:59:58
id:Galapagos No.3

Galapagos回答回数963ベストアンサー獲得回数892010/10/03 16:14:56

ポイント26pt

下記のようにすればできます。

なお、スクリプトはUTF-8で記述することが前提です。

もし$strがUTF-8意外でしたら、mb_convert_encoding関数を使ってUTF-8に変換してからpreg_match_all関数を適用してください。

<?php
$str = '"名前1"<aaa1@bbb1.com>,"名前2"<aaa2@bbb2.com>';

//配列$arrに分割格納する
$count = preg_match_all("/\"([^\"]*)\"<([0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+)>,?/u", $str, $arr);

//分割格納した内容を表示
for ($i = 0; $i < $count; $i++) {
    echo $arr[1][$i] . ', ' . $arr[2][$i] . '<br />';
}
?>

split関数はPHP5.3で非推奨となり、上で使っているpreg系関数に移行することが推奨されています。

  • id:windofjuly
    うぃんど 2010/10/03 16:09:50
    >splitが5.3では非推奨です。なにか変わりがありませんか
    どうして私のほうのコメントなのかわかりませんが、お答えすると preg-split があります
    http://www.php.net/manual/ja/function.preg-split.php
  • id:tezcello
    > splitが5.3では非推奨です。なにか変わりがありませんか
    正規表現を使っているなら、既出の通りでしょうけど、split(',', $str) の置き換えなら、正規表現を使っていないので、explode(), str_split() で良いように思うけど?
    http://jp2.php.net/manual/ja/function.explode.php
    http://jp2.php.net/manual/ja/function.str-split.php

    文字クラスの中ではかなりのメタ文字が意味を持たないので、わざわざあれもこれもエスケープする必要もなさそうだけど?
    それと、ドメイン名に記号類はあり得ないんじゃなかったかなぁ...
    メールアドレスにマッチする様な正規表現をわざわざしない方が吉かもしれないと感じています。
    メールアドレスが合っているもんだとするなら、それ以外を空にする(=削除する)などを組合せる方をよく使ってます。(はっきり言って手抜き)

    直接関係ないけど参考までに。
    http://blog.livedoor.jp/dankogai/archives/51189905.html

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません