Манипулирование / анализ строки в PHP - PullRequest
0 голосов
/ 27 апреля 2011

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

John Bo <jboe@gmail.com>, abracadbra@gmail.com, <asking@gmail.com>...

Как мне разобрать вышеуказанную строку в PHP и просто получить адреса электронной почты? Есть ли простой способ разобрать?

= Раджеш =

Ответы [ 4 ]

1 голос
/ 27 апреля 2011

Конечно, вы можете просто использовать регулярное выражение в строке, но регулярное выражение жалобы RFC является чудовищным.

Он также потерпит неудачу в маловероятном (но возможном событии) a@b.com <b@a.com> (если вы действительно не хотите, чтобы оба извлекались в этом случае).

$str = 'John Bo <jboe@gmail.com>, abracadbra@gmail.com, <asking@gmail.com>';

$items = explode(',', $str);
$items = array_map('trim', $items);

$emails = array();

foreach($items as $item) {
    preg_match_all('/<(.*?)>/', $item, $matches);

    if (empty($matches[1])) {
       $emails[] = $item;
       continue;
    }
    $emails[] = $matches[1][0];
}

var_dump($emails);

Ideone .

выход

array(3) {
  [0]=>
  string(14) "jboe@gmail.com"
  [1]=>
  string(20) "abracadbra@gmail.com"
  [2]=>
  string(16) "asking@gmail.com"
}
0 голосов
/ 27 апреля 2011

Однострочник без петель!

$str = 'John Bo <jboe@gmail.com>, abracadbra@gmail.com, <asking@gmail.com>';

$extracted_emails = array_map( function($v){ return trim( end( explode( '<', $v ) ), '> ' ); }, explode( ',', $str ) );

print_r($extracted_emails);

требуется PHP 5.3

0 голосов
/ 27 апреля 2011

Используйте int preg_match_all (string pattern, string subject, array matches, int flags), который будет искать "субъект" для всех совпадений шаблона регулярного выражения (формат perl), заполнять массив "совпадения" будет все совпадения регулярного выражения и возвращать количество совпадений.

См. http://www.regular -expressions.info / php.html

0 голосов
/ 27 апреля 2011

Самый простой способ был бы (и я ужасен в регулярных выражениях):

<?php

$emailstring = "John Bo <jboe@gmail.com>,<other@email.com>, abracadbra@gmail.com, <asking@gmail.com>";
$emails = explode(',',$emailstring);

for ($i = 0; $i < count($emails); $i++) {
    if (strpos($emails[$i], '<') !== false) {
        $emails[$i] = substr($emails[$i], strpos($emails[$i], '<')+1);
        $emails[$i] = str_replace('>','',$emails[$i]);
    }
    $emails[$i] = trim($emails[$i]);
}

print_r($emails);

?>

http://codepad.org/6lKkGBRM

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