お世話になります。  
下記のようなメールアドレス形式の文字列があったとします。

```

    テスト <test@example.com>
    
```

PHPでこの文字列を名前部分（例でいうと「テスト」の部分）とメールアドレスの部分（例でいうと「test@example.com」の部分）にわけて取得したいのですが、何かよい方法はないでしょうか。  
やはり正規表現で取り出すしかないでしょうか。  
何かよい方法があれば、アドバイスをいただけますと幸いです。  
以上、よろしくお願いいたします。
CC BY-SA 4.0
2020-02-27T05:42:35.780
63398
2022-05-15T18:07:30.683
2020-02-27T12:17:22.160
3060
29034
question
php mail
PHPでメールアドレス形式の文字列を名前とメールアドレスに分割する方法
こんにちは、速度面等からの理由で正規表現を使わずに、  
文字列から、なにか取り出したいケースで、かつ入力値が予測できる場合、  
私はexplodeを用いることが多いです。

```

    $a = "テスト<test@example.com>";
    $b = explode("<",$a);
    echo $b[0].PHP_EOL;
    echo str_replace(">","",$b[1]).PHP_EOL;
    
```

多分、正規表現の方がこのケースでは見通しがよくなると思います。
CC BY-SA 4.0
2020-02-27T06:20:38.967
63401
2020-02-27T06:20:38.967
37777
63398
answer
とりあえず、正規表現で書いてみました。  
ただ、もしかしたら不十分な点とかがあるかもしれません。  
何かお気づきの点があれば、教えていただけますと幸いです。

```

    <?php
    var_dump(separate_mail_address("\"テスト\" <test@example.com>"));
    
    // 名前とメールアドレスを分割して、配列にして返す関数
    function separate_mail_address($address){
    // 正規表現でマッチするかどうか調べる
    if (preg_match("/^(.*?)<(.*?)>$/", $address, $matches) === 1){
    // 名前部分を取り出す
    $name = $matches[1];
    // 名前部分が空っぽじゃなかったときの処理
    if ($name !== ""){
    // 「<」までで1つのパターンとして取り出しているため、末尾の空白を削除する
    $name = rtrim($name, " ");
    // 名前部分にダブルクォーテーションは利用できないので、削除する
    $name = str_replace('"', "", $name);
    }
    // メールアドレスの部分を取り出す
    $address = $matches[2];
    // 名前とアドレスを配列にしてセットする
    $ret = array($name, $address);
    // 正規表現にマッチしなかったときの処理
    }else{
    // 渡されたアドレスをそのまま配列にしてセットする
    $ret = array($address);
    }
    // 結果を返す
    return $ret;
    }
    ?>
    
```
CC BY-SA 4.0
2020-02-27T12:06:22.430
63411
2020-02-27T12:06:22.430
29034
63398
answer
以前に回答した正規表現ではかなり不十分だったこと、また、正規表現で行うのは難しいということで、結局ライブラリを利用することにしました。  
mailparseという拡張機能をインストールした上で、下記のようにすると、簡単に取得できました。

```

    var_dump(mailparse_rfc822_parse_addresses('"テスト" <test@example.com>'));
    
```
CC BY-SA 4.0
2020-03-09T06:12:53.957
63685
2020-03-09T06:12:53.957
29034
63398
answer