Удалить адреса электронной почты из строки в PHP

Я работаю с архивом электронной почты для юридической фирмы, которая получает почту от Postfix и использует PHP-скрипт для вставки сообщений в базу данных. В основном это работает нормально, но иногда регулярное выражение, которое я использую для анализа адресов электронной почты из заголовков From, To и Cc, не фиксирует адреса электронной почты со 100% точностью. Я пробовал другие решения, представленные здесь в stackoverflow (используя filter_var(), используя imap_rfc822_parse_adrlist, используя регулярное выражение в вопросе 1028553) с меньшим успехом, чем то, что у меня есть.

Я хочу свести к минимуму системные вызовы (сейчас я использую слишком много pregs) и повысить точность. Текущая функция принимает текст заголовка (поля From, To или Cc) и возвращает «чистые» адреса электронной почты, лишенные скобок, кавычек, комментариев и т. д.

Любая помощь, которую кто-либо может предоставить, будет оценена по достоинству, так как я в тупике!

Венди

Моя функция:

function return_proper ($email_string) {
if (is_array($email_string)) {
    $x = "";
    foreach ($email_string as $val) {
        $x .= "$val,";
    }
    $email_string = substr($x, 0, -1);
}

$email_string = strtolower(preg_replace('/.*?([A-Za-z0-9\_\+\.\'-]+@[A-Za-z0-9\.-]+).*?/', '$1,', $email_string));
$email_string = preg_replace('/\>/', "", $email_string);
$email_string = preg_replace('/,$/', "", $email_string);
$email_string = preg_replace('/^\'/', "", $email_string);
return $email_string;
}

person Wendy Thompson    schedule 11.01.2012    source источник
comment
У вас есть пример текста, на котором он не работает?   -  person Eli    schedule 11.01.2012
comment
Еще одно регулярное выражение... но оно хорошее; взгляните на те, которые предоставляет Hexillion по адресу: hexillion.com/samples — смешайте это с чем-то вроде PHP getmxrr чтобы убедиться, что домен имеет действительную запись MX, и вы, вероятно, не ошибетесь.   -  person CD001    schedule 11.01.2012
comment
Я предоставил несколько примеров ниже... исходная входная строка находится сверху, за которой следуют результаты функции. Это в основном работает, но я хотел бы упростить до одного preg_match_all и, возможно, лучше поймать некоторые из этих ошибок.   -  person Wendy Thompson    schedule 11.01.2012
comment
[11 января 2012 11:36:14] ‹[email protected]› (система доставки почты) [11 января 2012 11:36:14] [email protected], (система доставки почты) (в этом случае функция не удаляет текст , (система доставки почты)   -  person Wendy Thompson    schedule 11.01.2012
comment
Я мог бы думать об этом немного в обратном направлении, но вам нужно что-то, что извлекает только действительную часть электронной почты из заданной строки... так почему бы не искать это совпадение с подстановочными знаками в начале/конце, а только сопоставлять бит, который erm ... Матчи. Что-то вроде /^.*([VALID_EMAIL_REGEXP_PART).*$/ в основном, так что любые недопустимые символы до или после адреса электронной почты удаляются? Может быть, нужно немного взглянуть на жадные/нежадные RegExps PHP, но это должно работать.   -  person CD001    schedule 16.01.2012