el simbolo ^ hace que la coincidencia siempre tenga que empezar al inicio del string por lo que si tienes algo mas antes del correo jamas coincidira.
Aparte preg_match_all requiere que la expresion este envuelta en / o |
Yo para validar correos utilizo
[a-zA-Z] -> al inicio para asegurarme empieze con una letra
[a-zA-Z0-9\._-] -> para tomar todos los caracteres validos
@
[a-zA-Z0-9\._-] -> para extraer el dominio, tambien con caracteres validos
[a-z]{2,5} -> para conocer la extencion de dominio,,, eso de limitarlo a 3 caracteres ya no es valido ya que hay dominios mas largos como .ninja .agency .express entre muchos otros de nueva aparicion.
[a-zA-Z][a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-z]{2,5}
Código PHP:
Ver originalpreg_match_all("|[a-zA-Z][a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-z]{2,5}|", $texto, $coincidencias);
preg_match_all("/[a-zA-Z][a-zA-Z0-9\._-]+@[a-zA-Z0-9\._-]+\.[a-z]{2,5}/", $texto, $coincidencias);