从字符串中检索完整的电子邮件地址

Jam*_*mes 14 php regex laravel slack-api laravel-5.3

我目前正在使用Laravel构建Slack机器人,其中一个功能是它可以接收电子邮件地址并向其发送消息.

问题是电子邮件地址(例如bob@example.com)<mailto:bob@example.com|bob@example.com>来自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];
}
Run Code Online (Sandbox Code Playgroud)

这似乎与电子邮件地址一样正常工作bob@example.com,但是在使用电子邮件地址时似乎失败了bob.jones@example.com(<mailto:bob.jones@example.com|bob.jones@example.com>在这种情况下,函数将jones@example.com作为电子邮件地址返回.)

我对正则表达式不是很好,但是我可以使用/改变我的模式,还是从Slack提供的字符串中获取电子邮件地址的更好方法?

bcm*_*cfc 10

如果您知道它始终是它的格式,那么总是可以将正则表达式从等式中取出:

$testString = '<mailto:bob@example.com|bob@example.com>';

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

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

echo $addresses[0];
Run Code Online (Sandbox Code Playgroud)

  • 这与@ Kitson88的小调整相结合,效果非常好.谢谢你们俩! (4认同)
  • 只需在下面添加验证:`foreach($ addresses as $ value){if(filter_var($ value,FILTER_VALIDATE_EMAIL)){echo"Valid Email:".$ value."结果"; } (2认同)