Регулярное выражение для замены периода в имени части заголовка электронной почты? - PullRequest
0 голосов
/ 05 октября 2010

Я пытаюсь отправить электронное письмо на PHP, и система отклоняет его, потому что часть имени в адресе электронной почты содержит следующий период:

 Mr. Joe Nobody <jo_nobody@nowhere.com>

ЯИщите элегантное решение для замены всех периодов, которые не являются частью адреса электронной почты, пробелом или без символа.Моя проблема в том, что поле, которое я заменяю, может содержать более одной комбинации имени / адреса электронной почты, например так:

 Mr. Joe Nobody <joe_nobody@here.com>, Mrs. Jane Noone <jane_noone@there.com>

Кто-нибудь знает способ сделать это в PHP, используя стандартную обработку строк илирегулярное выражение?

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Этот шаблон регулярного выражения должен работать в PHP:

Шаблон поиска: \.(?=[^<]*<)

Заменить шаблон: пробел, подчеркивание или нет

, например:

  $email = 'Mr. Joe Nobody <joe_nobody@here.com>';
  $email = preg_replace('/\.(?=[^<]*<)/', '_', $email);
1 голос
/ 05 октября 2010
$result = array();
foreach(imap_rfc822_parse_adrlist('Mr. Joe Nobody <joe_nobody@here.com>, Mrs. Jane Noone <jane_noone@there.com>','') as $address){
   $result[] = preg_replace('/\.\s?/',' ',$address->personal)
      .' <'.$address->mailbox
      .'@'.$address->host.'>';
}
echo implode(', ',$result);

Но я согласен с комментарием Эфира, в этом быть не должно.

1 голос
/ 05 октября 2010

Как отмечено в комментариях выше, это действительно не должно требоваться системой электронной почты.Сказав это, вы можете удалить точки из адреса, игнорируя все, что находится между "<..>" следующим:

$a="Mr. Joe Nobody <joe_nobody@here.com>, Mrs. Jane Noone <jane_noone@there.com>";
$b=preg_replace("/([^<.]*)(\.|(<.*?>))/", "$1$3",$a); 
echo $b
...