Domanda

Sto cercando di creare uno script che eseguirà le sue azioni solo se l'indirizzo e-mail inserito dall'utente proviene da un dominio specifico. Ho creato un regex che sembra funzionare durante il test tramite l'utilità regex, ma quando viene utilizzato nel mio script PHP, mi dice che le e-mail valide non sono valide. In questo caso, desidero che qualsiasi e-mail proveniente da @ secondgearsoftware.com, @ secondgearllc.com o asia.secondgearsoftware.com faccia eco al successo e tutti gli altri vengano respinti.

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

Sto cercando di creare uno script che eseguirà le sue azioni solo se l'indirizzo e-mail inserito dall'utente proviene da un dominio specifico. Ho creato un regex che sembra funzionare durante il test tramite l'utilità regex, ma quando viene utilizzato nel mio script PHP, mi dice che le e-mail valide non sono valide. In questo caso, desidero che qualsiasi e-mail proveniente da @ secondgearsoftware.com, @ secondgearllc.com o asia.secondgearsoftware.com faccia eco al successo e tutti gli altri vengano respinti.

<*>

Non sono davvero sicuro di cosa sia successo con lo schema. Qualsiasi aiuto sarebbe apprezzato.

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

Non sono davvero sicuro di cosa sia successo con lo schema. Qualsiasi aiuto sarebbe apprezzato.

È stato utile?

Soluzione

Ti suggerisco di eliminare la regex e di utilizzare semplicemente stristr per verificare se corrisponde. Qualcosa del genere dovrebbe funzionare:

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

$email = urldecode(

Ti suggerisco di eliminare la regex e di utilizzare semplicemente stristr per verificare se corrisponde. Qualcosa del genere dovrebbe funzionare:

<*>

La funzione stristr restituisce l'indirizzo e-mail dalla parte in cui ha trovato una corrispondenza fino alla fine, che dovrebbe essere uguale alla corrispondenza in questo caso. Tecnicamente potrebbe esserci qualcosa prima dei domini (fkdskjfsdksfks.secondgeartsoftware.com), ma puoi semplicemente inserire " @ domainneeded.com " per evitare questo. Questo codice è anche leggermente più lungo, ma facilmente ampliabile con nuovi domini senza preoccuparsi di regex.

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

La funzione stristr restituisce l'indirizzo e-mail dalla parte in cui ha trovato una corrispondenza fino alla fine, che dovrebbe essere uguale alla corrispondenza in questo caso. Tecnicamente potrebbe esserci qualcosa prima dei domini (fkdskjfsdksfks.secondgeartsoftware.com), ma puoi semplicemente inserire " @ domainneeded.com " per evitare questo. Questo codice è anche leggermente più lungo, ma facilmente ampliabile con nuovi domini senza preoccuparsi di regex.

Altri suggerimenti

La tua espressione regolare è un po 'fuori (consentirà foo@secondgearsoftwaresecondgearsoftware.com) e può essere semplificata:

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

L'ho reso senza distinzione tra maiuscole e minuscole e l'ho ancorato alla fine della stringa.

Non sembra esserci la necessità di controllare cosa c'è prima di " @ " - se necessario, è necessario disporre di una routine di convalida adeguata, ma sembra che si desideri verificare se l'indirizzo di posta elettronica appartiene a uno di questi domini.

Probabilmente dovrai usare /\b[A-Z0-9\._%+-[+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i (notare i alla fine) per rendere il regex senza distinzione tra maiuscole e minuscole. Ho anche lasciato cadere i + poiché consentono una ripetizione infinita che non ha senso in questo caso.

Ecco una soluzione facile da mantenere usando le espressioni regolari

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

Ecco una soluzione facile da mantenere usando le espressioni regolari

i", $userProvidedEmail);

Ecco un paio di test:

$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

Ecco una soluzione facile da mantenere usando le espressioni regolari

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

Ecco una soluzione facile da mantenere usando le espressioni regolari

i", $userProvidedEmail);

Ecco un paio di test:

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

Risultato (1 sta passando ovviamente)

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top