Solo ejecuta el script si el correo electrónico ingresado es de un dominio específico

StackOverflow https://stackoverflow.com/questions/1822280

  •  10-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de crear un script que solo ejecutará sus acciones si la dirección de correo electrónico que ingresa el usuario es de un dominio específico. Creé una expresión regular que parece funcionar al probarla a través de la utilidad regex, pero cuando se usa en mi script PHP, me dice que los correos electrónicos válidos no son válidos. En este caso, quiero que cualquier correo electrónico que provenga de @ secondgearsoftware.com, @ secondgearllc.com o asia.secondgearsoftware.com se haga eco del éxito y que todos los demás sean rechazados.

$pattern = '/\b[A-Z0-9\._%+-]+@((secondgearsoftware|secondgearllc|euro\.secondgearsoftware|asia\.secondgearsoftware)+\.)+com/';
$email = urldecode(

Estoy tratando de crear un script que solo ejecutará sus acciones si la dirección de correo electrónico que ingresa el usuario es de un dominio específico. Creé una expresión regular que parece funcionar al probarla a través de la utilidad regex, pero cuando se usa en mi script PHP, me dice que los correos electrónicos válidos no son válidos. En este caso, quiero que cualquier correo electrónico que provenga de @ secondgearsoftware.com, @ secondgearllc.com o asia.secondgearsoftware.com se haga eco del éxito y que todos los demás sean rechazados.

<*>

No estoy realmente seguro de qué está mal con el patrón. Cualquier ayuda sería apreciada.

POST['email']); if (preg_match($pattern, $email)) { echo 'success'; } else { echo 'opposite success'; }

No estoy realmente seguro de qué está mal con el patrón. Cualquier ayuda sería apreciada.

¿Fue útil?

Solución

Le sugiero que suelte la expresión regular y simplemente use stristr para verificar si coincide. Algo como esto debería funcionar:

<?php
// Fill out as needed
$domains = array('secondgearsoftware.com', 'secondgearllc.com');

$email = urldecode(

Le sugiero que suelte la expresión regular y simplemente use stristr para verificar si coincide. Algo como esto debería funcionar:

<*>

La función stristr devuelve la dirección de correo electrónico de la parte donde encontró una coincidencia hasta el final, que en este caso debería ser la misma que la coincidencia. Técnicamente podría haber algo antes de los dominios (fkdskjfsdksfks.secondgeartsoftware.com), pero puede simplemente insertar " @ domainneeded.com " Para prevenir esto. Este código también es un poco más largo, pero se extiende fácilmente con nuevos dominios sin preocuparse por la expresión regular.

POST['email']); $found = false; for(i=0;i<count($domains);i++) { if ($domains[i] == stristr($email, $domains[i])) $found = true; } if ($found) ... ?>

La función stristr devuelve la dirección de correo electrónico de la parte donde encontró una coincidencia hasta el final, que en este caso debería ser la misma que la coincidencia. Técnicamente podría haber algo antes de los dominios (fkdskjfsdksfks.secondgeartsoftware.com), pero puede simplemente insertar " @ domainneeded.com " Para prevenir esto. Este código también es un poco más largo, pero se extiende fácilmente con nuevos dominios sin preocuparse por la expresión regular.

Otros consejos

Su expresión regular está un poco apagada (permitirá foo@secondgearsoftwaresecondgearsoftware.com) y se puede simplificar:

$pattern = '/@((euro\.|asia\.)?secondgearsoftware|secondgearllc)\.com$/i';

Lo hice sin distinción entre mayúsculas y minúsculas y lo anclé al final de la cadena.

Parece que no hay necesidad de verificar qué hay antes de " @ " - debe tener una rutina de validación adecuada para eso si es necesario, pero parece que solo desea verificar si la dirección de correo electrónico pertenece a uno de estos dominios.

Probablemente necesite usar /\b[A-Z0-9\._%+-font>+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i (observe el i al final) para que la expresión regular no distinga entre mayúsculas y minúsculas. También eliminé los + s ya que permiten una repetición infinita que no tiene sentido en este caso.

Aquí hay una solución fácil de mantener utilizando expresiones regulares

$domains = array(
    'secondgearsoftware',
    'secondgearllc',
    'euro\.secondgearsoftware',
    'asia\.secondgearsoftware'
);
preg_match("`@(" .implode("|", $domains). ")\.com

Aquí hay una solución fácil de mantener utilizando expresiones regulares

i", $userProvidedEmail);

Aquí hay un par de pruebas:

$tests = array(
    'bob@secondgearsoftware.com',
    'bob@secondgearllc.com',
    'bob@Xsecondgearllc.com',
    'bob@secondgearllc.net',
    'bob@euro.secondgearsoftware.org',
    'bob@euro.secondgearsoftware.com',
    'bob@euroxsecondgearsoftware.com',
    'bob@asia.secondgearsoftware.com'
);

foreach ( $tests as $test ) { 
    echo preg_match("`@(" .implode("|", $domains). ")\.com

Aquí hay una solución fácil de mantener utilizando expresiones regulares

$domains = array(
    'secondgearsoftware',
    'secondgearllc',
    'euro\.secondgearsoftware',
    'asia\.secondgearsoftware'
);
preg_match("`@(" .implode("|", $domains). ")\.com

Aquí hay una solución fácil de mantener utilizando expresiones regulares

i", $userProvidedEmail);

Aquí hay un par de pruebas:

i", $test), " <- $test\n"; }

Resultado (1 está pasando, por supuesto)

1 <- bob@secondgearsoftware.com
1 <- bob@secondgearllc.com
0 <- bob@Xsecondgearllc.com
0 <- bob@secondgearllc.net
0 <- bob@euro.secondgearsoftware.org
1 <- bob@euro.secondgearsoftware.com
0 <- bob@euroxsecondgearsoftware.com
1 <- bob@asia.secondgearsoftware.com
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top