I am trying to create a function to extract email to send but I do not find the solution
Thank you
email type : contact<contact@contact.com>, contact1<contact1@contact.com>
the function
JavaScript
x
public static function extractEmail(string $email)
{
$pattern = '/(?<=<)(.*?)+(?=>)/';
$result = preg_match_all($pattern , $email , $matches);
$result = explode(',', $result);
if (is_array($result)) {
foreach ($result as $token) {
$email = filter_var(filter_var($token, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);
if ($email !== false) {
$emails[] = $email;
}
}
return $emails[0];
} else {
return false;
}
}
and after I make a loop via foreach.
Advertisement
Answer
You could make use of array_map
and array_filter
to sanitize email addresses and remove invalid ones:
JavaScript
/**
* @return string[]
*/
function extractEmails(string $contactString): array
{
if (!preg_match_all('/<(?<emails>[^>]+)>/', $contactString, $matches)) {
return [];
}
return array_filter(array_map(static function (string $email): ?string {
$sanitizedEmail = filter_var($email, FILTER_SANITIZE_EMAIL);
return filter_var($sanitizedEmail, FILTER_VALIDATE_EMAIL) ? $sanitizedEmail : null;
}, $matches['emails']));
}
Usage:
JavaScript
print_r(extractEmails('contact<contact@contact.com>, contact1<contact1@contact.com>'));
// ['contact@contact.com', 'contact1@contact.com']
Basically:
preg_match_all
gathers all (supposed) email addresses within$matches['email']
array_map
sanitizes and validates said email addresses (null
is returned if one is invalid)array_filter
finally removes allnull
values.