[PHP] Controllo sintassi indirizzo email non funziona

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
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: [email protected]";

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: [email protected]

Array ( [0] => [email protected] [1] => o [2] => o )

In pratica, immettendo un indirizzo fittizio [email protected], 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à.
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
28
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 - (\-).
 

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
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.
 

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
Intendevo dire, perchè fare l'escape del trattino......non mi sembra sia un carattere "sensibile"
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
28
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:

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
Ma in realtà la documentazione dice che l'asterisco significa "zero o più volte" invece il punto interrogativo significa "zero o una volta sola"
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
28
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?
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
28
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: [email protected]).

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--[email protected]).
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.
 

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
Se io volessi carpire e salvare un indirizzo email da un testo di 1000 righe, come faccio ad isolarlo? Senza conoscerlo naturalmente...
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
28
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 è[email protected]) la ricerca non andrebbe a buon fine, in quanto ti preleverebbe è[email protected].
 

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
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.
 

CristianB72

Nuovo Utente
24 Giu 2016
24
1
3
49
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 ;-)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
149
63
PR
www.borgo-italia.it
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
Autore Titolo Forum Risposte Data
G Script php per invio email con controllo sintassi e record MX PHP 0
G Script php per invio email con controllo sintassi e record MX PHP 7
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
C [PHP] Controllo <select> comportamento anomalo PHP 2
A [PHP] Controllo nome utente form di registrazione PHP 4
L [PHP] controllo dimensione immagine per il resize PHP 2
P [PHP] Controllo al checkbox privacy PHP 6
T [php] controllo su estensione file PHP 7
M [PHP] Script per controllo disponibilitá negozio in citta PHP 4
F Controllo dati sui campi di input tramite php PHP 1
M [PHP] Dubbio controllo IF PHP 15
M [PHP] Controllo campo cap con trattino oltre ai numeri PHP 3
Fede72 Controllo registrazioni PHP Mysql PHP 5
bubino8 [PHP] Controllo Log e Modifiche Utenti PHP 5
P [PHP] Realizzare un controllo accessi cantiere, problema lettore Qrcode... PHP 0
M [PHP] Controllo inserimento in tempo reale PHP 0
M [PHP] Help: controllo valori inseriti in un campo PHP 1
M [PHP] Impedire di digitare determinati caratteri nell’input (controllo in tempo reale) PHP 4
giancadeejay [PHP] Controllo inserimento tot caratteri PHP 5
giancadeejay [PHP] Controllo su quantita' di caratteri inseriti, in colonna db PHP 5
M [PHP] controllo inserimento dati un un form PHP 4
ANDREA20 [PHP] Controllo email se e valida PHP 5
P controllo browser sul server o in php? PHP 2
F controllo form php con restituzione errori nella form PHP 10
B Problemi con pannello di controllo PHP PHP 0
B Problemi con pannello di controllo PHP PHP 0
L [php] upload controllo dimensione immagine PHP 8
Z Controllo campi di un form php PHP 5
X Eseguire controllo su variabili php PHP 1
P Controllo php su checkbox PHP 2
X controllo e scrittura su db mysql con pagine php PHP 4
P controllo dati form con jquery e php PHP 8
L [PHP e FTP upload] controllo file allegato PHP 6
L [PHP] Sapere se si lavora in locale o remoto (Controllo server Database) PHP 1
max_400 Messenger HTML - PHP - Controllo script PHP 29
A Sicurezza e controllo password in PHP PHP 4
X Controllo versione minima PHP PHP 1
E campo controllo in formail php PHP 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 4
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 0
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G leggere file txt e stampare con php il contenuto a video PHP 7

Discussioni simili