/** * @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); }