Controllo validazione email con php seguendo le specifiche RFC

validazione.email

Rileggendo il mio post precedente sulla validazione email tramite javascript e considerando il fatto che non sono riuscito a trovare una funzione equivalente in PHP, ho pensato di convertire la funzione io stesso.
I passaggi sono stati pochi, poiché le espressioni regolari non cambiano più di tanto tra javascript e perl.

Tutto è nato osservando la funzione di verifica delle email di CodeIgniter, la quale non considera le specifiche RFC riguardo alle email.

Alla mia segnalazione del problema nel forum di CodeIgniter la loro risposta è stata: “La nostra validazione funziona nel 90% dei casi”. Ok, sarà vero, ma in futuro?
Sempre più gente possiede un sito web personale ed in futuro ci potrebbero essere molte più persone con indirizzi email “strani”. Quindi perché non mettere le mani avanti?

Codifica in PHP

   /**
    * Valid Email
    *
    * @access   public
    * @param    string
    * @return   bool
    *
    * Original author:  Sandeep V. Tamhankar (stamhankar@hotmail.com)
    * changes by Craig Cockburn to accommodate top level domains .museum and .name
    * PHP translations by Chalda Pnuzig https://blog.chalda.it/?p=11
    */
   function emailCheck($emailStr){
      $emailPat = '/^(.+)@(.+)$/';
      $specialChars = '\\(\\)<>@,;:\\\\\\\"\\.\\[\\]';
      $validChars = '[^\\s' . $specialChars . ']';
      $quotedUser = '("[^"]*")';
      $ipDomainPat = '/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/';
      $atom = $validChars . '+';
      $word = '(' . $atom . '|' . $quotedUser . ')';
      $userPat = '/^' . $word . '(\\.' . $word . ')*$/';
      $domainPat = '/^' . $atom . '(\\.' . $atom . ')*$/';

      if (! preg_match($emailPat, $emailStr, $matchArray)) {
         echo 'L\'email sembra essere sbagliata: (controlla @ e .)';
         return false;
      }

      $user = $matchArray[1];
      $domain = $matchArray[2];

      if (! preg_match($userPat, $user)) {
         echo 'La parte dell\'email prima di "@" non sembra essere valida!';
         return false;
      }
      if (preg_match($ipDomainPat, $domain, $IPArray)){
         for ($i = 1; $i <= 4; $i++) {
            if ($IPArray[$i] > 255) {
               echo 'L\'IP di destinazione non è valido!';
               return false;
            }
         }
         return true;
      }

      if (! preg_match($domainPat, $domain, $domainArray)){
         echo 'La parte dell\'email dopo "@" non sembra essere valida!';
         return false;
      }

      $atomPat = '/'.$atom.'/';

      if (preg_match_all($atomPat,$domain, $domArr)){
         $domArr = $domArr[0];
         $len = count($domArr);
         $firstDoaminLevel = strlen($domArr[$len - 1]);
         if ( ( $firstDoaminLevel < 2) || ($firstDoaminLevel > 6) ) {
             echo 'Il dominio di primo livello (es: .com e .it) non sembra essere valido!';
             return false;
         }
         if ($len < 2) {
            echo 'L\'indirizzo manca del dominio!';
            return false;
         }
      }

      return true;
   }

La codifica per CodeIgniter la trovate in un mio post sul loro forum

Unisciti alla discussione

1 commento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *