예제 #1
0
파일: Email.php 프로젝트: afterlogic/mailso
 /**
  * @param string $sEmailAddress
  * @return \MailSo\Mime\Email
  *
  * @throws \MailSo\Base\Exceptions\InvalidArgumentException
  */
 public static function Parse($sEmailAddress)
 {
     if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) {
         throw new \MailSo\Base\Exceptions\InvalidArgumentException();
     }
     $sName = '';
     $sEmail = '';
     $sComment = '';
     $bInName = false;
     $bInAddress = false;
     $bInComment = false;
     $iStartIndex = 0;
     $iEndIndex = 0;
     $iCurrentIndex = 0;
     while ($iCurrentIndex < \strlen($sEmailAddress)) {
         switch ($sEmailAddress[$iCurrentIndex]) {
             //				case '\'':
             case '"':
                 //$sQuoteChar = $sEmailAddress{$iCurrentIndex};
                 if (!$bInName && !$bInAddress && !$bInComment) {
                     $bInName = true;
                     $iStartIndex = $iCurrentIndex;
                 } else {
                     if (!$bInAddress && !$bInComment) {
                         $iEndIndex = $iCurrentIndex;
                         $sName = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1);
                         $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1);
                         $iEndIndex = 0;
                         $iCurrentIndex = 0;
                         $iStartIndex = 0;
                         $bInName = false;
                     }
                 }
                 break;
             case '<':
                 if (!$bInName && !$bInAddress && !$bInComment) {
                     if ($iCurrentIndex > 0 && \strlen($sName) === 0) {
                         $sName = \substr($sEmailAddress, 0, $iCurrentIndex);
                     }
                     $bInAddress = true;
                     $iStartIndex = $iCurrentIndex;
                 }
                 break;
             case '>':
                 if ($bInAddress) {
                     $iEndIndex = $iCurrentIndex;
                     $sEmail = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1);
                     $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1);
                     $iEndIndex = 0;
                     $iCurrentIndex = 0;
                     $iStartIndex = 0;
                     $bInAddress = false;
                 }
                 break;
             case '(':
                 if (!$bInName && !$bInAddress && !$bInComment) {
                     $bInComment = true;
                     $iStartIndex = $iCurrentIndex;
                 }
                 break;
             case ')':
                 if ($bInComment) {
                     $iEndIndex = $iCurrentIndex;
                     $sComment = \substr($sEmailAddress, $iStartIndex + 1, $iEndIndex - $iStartIndex - 1);
                     $sEmailAddress = \substr_replace($sEmailAddress, '', $iStartIndex, $iEndIndex - $iStartIndex + 1);
                     $iEndIndex = 0;
                     $iCurrentIndex = 0;
                     $iStartIndex = 0;
                     $bInComment = false;
                 }
                 break;
             case '\\':
                 $iCurrentIndex++;
                 break;
         }
         $iCurrentIndex++;
     }
     if (\strlen($sEmail) === 0) {
         $aRegs = array('');
         if (\preg_match('/[^@\\s]+@\\S+/i', $sEmailAddress, $aRegs) && isset($aRegs[0])) {
             $sEmail = $aRegs[0];
         } else {
             $sName = $sEmailAddress;
         }
     }
     if (\strlen($sEmail) > 0 && \strlen($sName) == 0 && \strlen($sComment) == 0) {
         $sName = \str_replace($sEmail, '', $sEmailAddress);
     }
     $sEmail = \trim(\trim($sEmail), '<>');
     $sName = \MailSo\Base\Utils::CustomTrim(\trim($sName), '"');
     //standard trim removes more than necessary
     //$sName = \trim(\trim($sName), '"');
     $sName = \trim($sName, '\'');
     $sComment = \trim(\trim($sComment), '()');
     // Remove backslash
     $sName = \preg_replace('/\\\\(.)/s', '$1', $sName);
     $sComment = \preg_replace('/\\\\(.)/s', '$1', $sComment);
     return Email::NewInstance($sEmail, $sName, $sComment);
 }