как разделить имя и адрес электронной почты в php или с помощью регулярного выражения - PullRequest
0 голосов
/ 27 октября 2009

У меня есть следующая строка:

"Test, User" < test@test.com >, "Another, Test" < another@test.com >, .........

Я хочу следующий результат:

array(
  array('name' => 'Test, User', 'email' => 'test@test.com'),
  array('name' => 'Another, Test', 'email' => 'another@test.com'),  
  ...........
) 

Ответы [ 5 ]

9 голосов
/ 27 октября 2009

preg_match_all() представляется целесообразным:

$in = '"Test, User" < test@test.com >, "Another, Test" < another@test.com >, .........';
preg_match_all('!"(.*?)"\s+<\s*(.*?)\s*>!', $in, $matches);
$out = array();
for ($i=0; $i<count($matches[0]); $i++) {
  $out[] = array(
    'name' => $matches[1][$i],
    'email' => $matches[2][$i],
  );
}
print_r($out);

Выход:

Array
(
    [0] => Array
        (
            [name] => Test, User
            [email] => test@test.com
        )

    [1] => Array
        (
            [name] => Another, Test
            [email] => another@test.com
        )

)
2 голосов
/ 16 июля 2011

Я объединил этот ответ с другим здесь, чтобы создать довольно полный анализатор:

function parseEmailListToArray($list) {
    $t = str_getcsv($list);

    foreach($t as $k => $v) {
        if (strpos($v,',') !== false) {
            $t[$k] = '"'.str_replace(' <','" <',$v);
        }
    }

    foreach ($t as $addr) {
        if (strpos($addr, '<')) {
            preg_match('!(.*?)\s?<\s*(.*?)\s*>!', $addr, $matches);
            $emails[] = array(
                'email' => $matches[2],
                'name' => $matches[1]
            );
        } else {
            $emails[] = array(
                'email' => $addr,
                'name' => ''
            );
        }
    }

    return $emails;
}
0 голосов
/ 12 марта 2016

Пока не могу комментировать, но, исходя из ответа Клетуса, я расширил регулярное выражение до:

$regex = '/(("([^"]*)"|[^",]*)\\s*<(.*?)>|[^",\\s]+)(?=(,|$))/';
preg_match_all($regex,$in,$matches,PREG_SET_ORDER);
$out = [];
foreach($matches as $match) $out[] = [
  'name' => $match[3] ?: trim($match[2]),
  'email' => trim($match[4]) ?: $match[1]
];

Это также будет соответствовать простому foo@acme.com или <bar@acme.com> (тогда name будет пустым) и имени без кавычек.

0 голосов
/ 27 октября 2009
$strs = preg_split($in,'".*" < .* >,');
foreach ($strs as $str){
$in1 = preg_match('/".+"/', $str);
$in2 = preg_match('/< .+ >/', $str);
push($out,array('name'=>$in1,'email'=>$in2);
}
echo $out;
0 голосов
/ 27 октября 2009

Почему бы вам не preg_split по шаблону, совпадающему с:

"Test, User" < test[at]test.com >,

Затем preg_match , чтобы найти имя и компоненты электронной почты, а затем поместить их в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...