извлечь письмо - PullRequest
       111

извлечь письмо

1 голос
/ 07 августа 2020

У меня что-то вроде этого:

test<test@test.com>, test1<test1@test.com>,test2<test2@test.com>

Я пытаюсь извлечь только почту: test@test.com

моя функция

      public static function extractEmail($string)
{
  $emails = [];

  foreach (preg_split('/\s/', $string) as $token) {
    $email = filter_var(filter_var($token, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
    if ($email !== false) {
      $emails[] = $email;
    }
  }

  return $emails;
}

Результат $email : У меня testtest@test.com а не

test@test.com

чем у вас

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Чтобы сопоставить адреса электронной почты для примера строки, вы можете использовать группу захвата и привязку \G для получения непрерывных совпадений после сопоставления первой части строки.

(?:[^\s<>]+<|\G(?!^))([^\s@<>]+@[^\s@<>]+)>(?:,\h*|$)

Объяснение

  • (?: Группа без захвата
    • [^\s<>,]+< Соответствует 1+ раз любому символу, кроме символа пробела или скобок
    • | Или
    • \G(?!^) Подтвердить позицию в конце предыдущего совпадения
  • ) Закрыть группу
  • ( Захват группа 1
    • [^\s@<>]+@[^\s@<>]+ Соответствие шаблону электронной почты с использованием отрицательного класса символов
  • ) Закрыть группу 1
  • >(?:,\h*|$) Сопоставьте > и запятую и 0+ горизонтальных пробелов или подтвердите конец строки

Regex demo | Php демонстрация

Например

$re = '/(?:[^\s<>]+<|\G(?!^))([^\s@<>]+@[^\s@<>]+)>(?:,\h*|$)/';
$str = 'test<test@test.com>, test1<test1@test.com>,test2<test2@test.com>';
preg_match_all($re, $str, $matches);
print_r($matches[1]);

Вывод

Array
(
    [0] => test@test.com
    [1] => test1@test.com
    [2] => test2@test.com
)
0 голосов
/ 07 августа 2020

Может ли это вам помочь:

$pattern = '/(?<=<)(.*?)+(?=\>)/';
$string = 'test<test@test.com>, test1<test1@test.com>,test2<test2@test.com>';
preg_match_all($pattern , $string , $emails);
var_dump($emails[0]);

Результат:

array(3) {
  [0]=>
  string(13) "test@test.com"
  [1]=>
  string(14) "test1@test.com"
  [2]=>
  string(14) "test2@test.com"
}
0 голосов
/ 07 августа 2020

Вы можете создать, вызвать и использовать следующую функцию.

<?php
    function stripText($text){
        $lesspos=stripos($text,"<")+1;//finding the position of < and set the start of substring by adding one
        $greatpos=stripos($text,">")+1;//finding the position of >
        $length=strlen($text)-$lesspos-$greatpos;//length of the string between the two symbol
        $stripedtext=substr($text,$lesspos,$length);//striping the text we need out
        return $stripedtext;//returning the striped text
    }
    $text="test<test@example.com>";
    echo stripText($text);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...