Получить полный адрес электронной почты из строки

В настоящее время я создаю бота Slack с использованием Laravel, и одна из его возможностей заключается в том, что он может получить адрес электронной почты и отправить ему сообщение.

Проблема заключается в том, что адреса электронной почты (например, [email protected]) пройти через <mailto:[email protected]|[email protected]> из Slack.

В настоящее время у меня есть функция, которая получает письмо от этого:

public function getEmail($string)
{
$pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
preg_match_all($pattern, $string, $matches);
$matches = array_filter($matches);

return $matches[0][0];
}

Казалось, что это нормально работает с адресами электронной почты, такими как [email protected]Однако при работе с адресами электронной почты, такими как [email protected] (который будет проходить как <mailto:[email protected]|[email protected]>,
В этих случаях функция возвращает [email protected] как адрес электронной почты.

Я не очень хорошо разбираюсь в regex, но есть ли что-то еще, что я мог бы использовать / изменить в своем шаблоне, или лучший способ получить адрес электронной почты из строки, предоставленной Slack?

14

Решение

Всегда можно вывести регулярное выражение из уравнения, если вы знаете, что это всегда тот формат, в котором он будет:

$testString = '<mailto:[email protected]|[email protected]>';

$testString = str_replace(['<mailto:', '>'], '', $testString);

$addresses = explode('|', $testString);

echo $addresses[0];
10

Другие решения

Этот метод сделает работу, и вы избегаете регулярных выражений. и убедитесь, что возвращаемое письмо является реальным адресом электронной почты, проверив его с помощью функций php.

function getEmailAddress($string)
{
$string = trim($string, '<>');
$args = explode('|', $string);
foreach ($args as $_ => $val) {
if(filter_var($val, FILTER_VALIDATE_EMAIL) !== false) {
return $val;
}
}

return null;
}

echo getEmailAddress('<mailto:[email protected]|[email protected]>');

Выход

[email protected]
4

Вы знаете, что строки, содержащие адрес электронной почты, всегда будут иметь вид <mailto:[email protected]|[email protected]>так что используйте это. В частности, вы знаете, что строка будет начинаться с <mailto:, будет содержать |и закончится >,

Однако сложность заключается в том, что местная часть адреса электронной почты также может содержать символ канала, но домен не может; см. следующий вопрос
Какие символы разрешены в адресе электронной почты?

public function getEmail($string)
{
$pattern = '/^<mailto:([^@]+@[^|]+)|(.*)>$/i';
preg_match_all($pattern, $string, $matches);
$matches = array_filter($matches);
return $matches[1][0];
}

Это соответствует полной строке от начала до конца, но мы фиксируем адрес электронной почты в первом наборе скобок. $matches[1] содержит все совпадения из первых захватывающих скобок. Вы могли бы использовать preg_match вместо этого, поскольку вы ищете не все совпадения, только первый.

0
По вопросам рекламы [email protected]