Получить полный адрес электронной почты из строки
В настоящее время я создаю Slack-бот с использованием Laravel, и одна из возможностей заключается в том, что он может получать адрес электронной почты и отправлять ему сообщение.
Проблема в том, что адреса электронной почты (например, [email protected]
) проходят через <mailto:[email protected]|[email protected]>
из Slack.
В настоящее время у меня есть функция, которая извлекает электронное письмо из этого:
public function getEmail($string)
{
$pattern = '/[a-z0-9_\-\+][email protected][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]
в качестве адреса электронной почты.
Я не очень хорошо знаком с регулярным выражением, но есть ли что-то еще, что я мог бы использовать/изменить в своем шаблоне, или лучший способ получить адрес электронной почты из строки, предоставленной Slack?
Ответы
Ответ 1
Может всегда вызывать регулярное выражение из уравнения, если вы знаете, что всегда в формате, в котором он будет:
$testString = '<mailto:[email protected]|[email protected]>';
$testString = str_replace(['<mailto:', '>'], '', $testString);
$addresses = explode('|', $testString);
echo $addresses[0];
Ответ 2
Этот метод выполнит эту работу, и вы избежите регулярных выражений. и убедитесь, что возвращаемое письмо является настоящим адресом электронной почты, подтвердив его с помощью 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]
Ответ 3
Вы знаете, что строки, содержащие адрес электронной почты, всегда будут иметь форму <mailto:[email protected]|[email protected]>
, поэтому используйте это. В частности, вы знаете, что строка начнется с <mailto:
, будет содержать |
и закончится с >
.
Сложная сложность заключается в том, что локальная часть адреса электронной почты может содержать и символ канала, но домен не может; см. следующий вопрос.
Какие символы разрешены в адресе электронной почты?
public function getEmail($string)
{
$pattern = '/^<mailto:([^@][email protected][^|]+)|(.*)>$/i';
preg_match_all($pattern, $string, $matches);
$matches = array_filter($matches);
return $matches[1][0];
}
Это соответствует полной строке от начала до конца, но мы фиксируем адрес электронной почты в первом наборе круглых скобок. $matches[1]
содержит все совпадения из первых скобок. Вместо этого вы можете использовать preg_match
, так как вы не ищете все совпадения, просто первый.