[PHP] Controllo sintassi indirizzo email non funziona

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
53
Salve ragazzi, studio PHP da alcuni mesi, ho tentato di fare un classico controllo della sintassi di indirizzi email ma provando vari script contenenti qualche piccola variazione dell'espressione regolare, sembra non funzionare bene, ovvero, lascia passare alcuni indirizzi email, troncandoli:

Codice:
<?php

$frase = "Per informazioni scrivere a: ciccio--pasticcio@libero.it";

echo $frase . "<br/><br/>";

if (preg_match('/\b[a-z0-9]([-_.]?[a-z0-9])*@[a-z0-9]([-.]?[a-z0-9])*\.[a-z]{2,4}\b/', $frase, $a) == 1)
    {
        print_r($a);
    }else
        {
            echo "Non ho trovato nulla!";
        }
?>

Come risultato mi da:
Per informazioni scrivere a: ciccio--pasticcio@libero.it

Array ( [0] => pasticcio@libero.it [1] => o [2] => o )

In pratica, immettendo un indirizzo fittizio ciccio--pasticcio@libero.it, lo script mi lascia passare soltanto un array con l'indirizzo troncato e quindi incompleto.
Dove sbaglio?
Provando anche senza "\b", le cose non cambiano!
Grazie mille a chi risponderà.
 
Ciao,
prova a sostituire con questo:
PHP:
preg_match('/\b[a-z0-9]([\-_.]*[a-z0-9])*@[a-z0-9]([\-.]*[a-z0-9])*\.[a-z]{2,4}\b/', $frase, $a)

In sostanza, non ho fatto altro che sostituire i ? con * e a fare l'escape dei - (\-).
 
Quello che non capisco è perchè fare l'escape del backslash. Poi mi ero dimenticato di dire che i 3 trattini dovrebbero dare email sbagliata. Anche perchè credo che la sistassi esatta non prevede trattini, underscores o punti multipli. Ecco perchè avevo messo il punto interrogativo al posto dell'asterisco.
 
Intendevo dire, perchè fare l'escape del trattino......non mi sembra sia un carattere "sensibile"
 
Invece lo è perché, come vedi, è utilizzato per specificare un intervallo (vedi [a-z] o [0-9]). Per la questione asterisco, punto interrogativo, nella documentazione è riportato che hanno lo stesso significato, io ho scritto in maniera omogenea utilizzando solo l'asterisco e non la.combinazione dei due.
 
Ultima modifica:
Ma in realtà la documentazione dice che l'asterisco significa "zero o più volte" invece il punto interrogativo significa "zero o una volta sola"
 
Ma in realtà la documentazione dice che l'asterisco significa "zero o più volte" invece il punto interrogativo significa "zero o una volta sola"
Hai ragione, errore mio.

In ogni caso, credo di aver male interpretato il tuo problema. Tu non vuoi che quell'indirizzo passi (troncato o meno che sia); vuoi che venga respinto. Dico bene?
 
Il problema è che tu esegui la funzione su una stringa che non è un indirizzo email, bensì una frase in cui DOVREBBE essere contenuto un indirizzo email valido.
(Per informazioni scrivere a: ciccio--pasticcio@libero.it).

Implementando la funzione, passandogli questo tipo di stringa, tu stai sostanzialmente dicendole "Trovami un indirizzo email valido, composto così come ti ho detto, all'interno di questa stringa". A quel punto la funzione va a cercare un indirizzo email che rispetti le regole che hai fornito. (Per informazioni scrivere a: ciccio--pasticcio@libero.it).
Trovando un doppio trattino, tronca necessariamente l'indirizzo invece di rifiutarlo completamente, semplicemente perché il resto della stringa che segue i trattini rispetta le regole che hai fornito alla funzione (e tu non hai specificato che la stringa deve rispettare i criteri dall'inizio alla fine dell'intera stringa, ma solo da un certo punto in poi).

Per ovviare a tale problema, potresti prima isolare l'indirizzo email e successivamente fare il controllo solo su questa stringa.
 
Se io volessi carpire e salvare un indirizzo email da un testo di 1000 righe, come faccio ad isolarlo? Senza conoscerlo naturalmente...
 
La prima cosa che mi viene in mente è quella di ricercare all'interno del testo la @ e da lì prendere tutto il testo che viene prima e dopo la chiocciola, fino a che non si incontrano degli spazi.

Tuttavia questo metodo fallisce nel caso di errori di battitura, quindi per esempio nel seguente testo (Il mio indirizzo email ècicciopallino@libero.it) la ricerca non andrebbe a buon fine, in quanto ti preleverebbe ècicciopallino@libero.it.
 
si giusto. Cmq grazie dell'aiuto. Spero nei prox giorni quando ci ritorno su, di risolvere meglio. Certo solitamente gli indirizzi email si controllano tramire i form che la gente compila, li gli indirizzi sono molto piu circoscritti e si possono controllare molto meglio.
 
Comunque visto che sono molto pignolo su alcune cose, vorrei specificare che non è necessario fare l'escape del trattino perchè esso ha valore come elemento "sensibile" al linguaggio di programmazione solo ed esclusivamente quando è messo in mezzo a due numeri o due lettere. Fuori da quel contesto, ha un semplice valore di carattere. Infatti se fai un test, vedrai che fare l'escape del trattino è superfluo. Certo se lo si mette o no, al massimo si perde un millisecondo ;-)
 
ciao
al posto del preg_match potresti usare la funzione filter_var(), secondo me più semplice e performante
PHP:
<?php
//....
$email=filter_var($email, FILTER_SANITIZE_EMAIL);
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo "indirizzo non valido";
}else{
    echo "$email è un indirizzo valido";;
}
//.....
?>
 

Discussioni simili