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
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:
/**
* @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:
print_r(extractEmails('contact<contact@contact.com>, contact1<contact1@contact.com>'));
// ['contact@contact.com', 'contact1@contact.com']
Basically:
preg_match_allgathers all (supposed) email addresses within$matches['email']array_mapsanitizes and validates said email addresses (nullis returned if one is invalid)array_filterfinally removes allnullvalues.