Έλεγχος έγκυρης σύνταξης των e-mail

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Sermac
Δημοσιεύσεις: 363
Εγγραφή: 26 Σεπ 2007 21:08

Έλεγχος έγκυρης σύνταξης των e-mail

Δημοσίευση από Sermac » 21 Σεπ 2010 01:55

Έλεγχος έγκυρης σύνταξης των e-mail με preg_match() και κανονικές εκφράσεις

Το ξέρω πως υπάρχουν 100άδες παραδείγματα στο Google, αλλά το 99% εξ αυτών επιτρέπουν στους χαρακτήρες ".", "-" και "_" είτε να τοποθετούνται στις άκρες των λέξεων, είτε να επαναλαμβάνονται (π.χ. ex..ample@email.com), είτε να συνδυάζονται (π.χ. ex.-ample@email.com). Ο παρακάτω κώδικας, λοιπόν, είναι πιο αυστηρός.

Κώδικας: Επιλογή όλων

function checkEmail($email) {
    // Checks if an email address is possibly valid
    if (!empty($email)) {
        $pattern_alias  = '/^([a-z0-9]+(_|\.|-)?)*[a-z0-9]+';
        $pattern_at     = '\@';
        $pattern_domain = '([a-z0-9]+(\.|-)?)*[a-z0-9]+';
        $pattern_tld    = '\.[a-z]{2,4}$/i';
        
        $pattern = $pattern_alias . $pattern_at . $pattern_domain . $pattern_tld;
        
        if (preg_match($pattern, $email))
            echo 'valid';
        else 
            echo 'invalid';
    }
    else
        echo 'empty';
}
Επεξηγήσεις:

Κώδικας: Επιλογή όλων

Alias
/^                      Αρχή
[a-z0-9]+               Ένα ή περισσότερα αλφαριθμητικά.
(_|\.|-)?               Καμία ή μία κάτω παύλα, τελεία ή παύλα.
[a-z0-9]+(_|\.|-)?)*    Ένα ή περισσότερα αλφαριθμητικά ακολουθούμενα από καμία ή μία κάτω παύλα, τελεία ή παύλα. Επανάληψη μηδέν ή περισσότερες φορές.
[a-z0-9]+               Ο τελευταίος χαρακτήρες να είναι ένα ή περισσότερα αλφαριθμητικά.

Domain(s)
[a-z0-9]+               Ένα ή περισσότερα αλφαριθμητικά.
(\.|-)?                 Καμία ή μία τελεία ή παύλα.
([a-z0-9]+(\.|-)?)*     Ένα ή περισσότερα αλφαριθμητικά ακολουθούμενα από καμία ή μία τελεία ή παύλα. Επανάληψη μηδέν ή περισσότερες φορές.
[a-z0-9]+               Ο τελευταίος χαρακτήρες να είναι ένα ή περισσότερα αλφαριθμητικά.

TLD
\.                      Ο πρώτος χαρακτήρες να είναι μία τελεία.
[a-z]{2,4}              Δύο έως και 4 γράμματα.
$                       Τέλος

i                       Case Insensitive (δηλ. abc=ABC)
Αποτελέσματα:

Κώδικας: Επιλογή όλων

Alias
example@email.com           valid
e@email.com                 valid
-example@email.com          invalid
example-@email.com          invalid
ex-ample@email.com          valid
ex-am-ple@email.com         valid
ex--ample@email.com         invalid
("-" = "." = "_")

Domain(s)
example@email.com           valid
example@e.com               valid
example@-email.com          invalid
example@email-.com          invalid
example@e-mail.com          valid
example@e--mail.com         invalid
example@e_mail.com          invalid
example@e-mail.com.gr       valid
("." = "-")

TLD
example@email.com           valid
example@email.gr            valid
example@email.info          valid
example@email.s             invalid
example@email.toolong       invalid
Χαρακτήρας "+":
Στο alias μπορείτε αν θέλετε να προσθέσετε και τον χαρακτήρα "+". Το gmail και άλλες υπηρεσίες χρησιμοποιούν αυτό το σύμβολο για να προσθέτουν ετικέτες.

Κώδικας: Επιλογή όλων

        $pattern_alias  = '/^([a-z0-9]+(_|\.|-|\+)?)*[a-z0-9]+';
Περισσότερες πληροφορίες:
http://en.wikipedia.org/wiki/Email_address#Address_tags
http://lmgtfy.com/?q=gmail+plus+sign
Σε περίπτωση που δουλέψετε με js, ίσως χρειαστεί να κάνετε escape το "+" με τη συνάρτηση encodeURIComponent().


Link για δοκιμές:
http://regexr.com?2s783

Χρήσιμες συνδέσεις:
http://php-regex.blogspot.com/
http://php.net/manual/en/function.preg-match.php

Tags:
regular expressions, κανονικές εκφράσεις, php, preg_match(), email, e-mail, ηλεκτρονική διεύθυνση, έλεγχος, σύνταξη, εγκυρότητα


Δεν ξέρω αν πόσταρα στη σωστή ενότητα. Ίσως πρέπει να μεταφερθεί εδώ.
Τελευταία επεξεργασία από το μέλος Sermac την 23 Σεπ 2010 15:49, έχει επεξεργασθεί 2 φορές συνολικά.
Εικόνα

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Έλεγχος έγκυρης σύνταξης των e-mail

Δημοσίευση από korgr » 21 Σεπ 2010 10:06

:clap:

Πολύ καλό, να είσαι καλά που το μοιράζεσαι!

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Έλεγχος έγκυρης σύνταξης των e-mail

Δημοσίευση από cpulse » 21 Σεπ 2010 13:07

Αυτά που γράφεις ισχύουν για το 99.9% των περιπτώσεων, αλλά σύμφωνα με τις επίσημες οδηγίες επιτρέπονται και παπάκια και spaces και άλλοι χαρακτήρες στα emails πριν το παπακι.

Ένα καιρό είχα φτιάξει ένα regular expression το οποίο ακολουθούσε το RFC 3696, section 3.

Κώδικας: Επιλογή όλων

if (!preg_match('/^[-!#$%&\'*+\/=?^_`{|}~a-z0-9]+(\.[-!#$%&\'*+\/=?^_`{|}~a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/Di', $email))
    $reply_error = 'EMAIL_INVALID';
Αλλά, όπως κι εσύ έτσι κι εγώ χρησιμοποιώ ένα άλλο regular expression το οποίο είναι πιο κοντά στις συνήθειες μας

Κώδικας: Επιλογή όλων

if (!preg_match('/^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*$/i', $email))
    $reply_error = 'EMAIL_INVALID';

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης