+ $oAddr->mailbox = $sEmail;
+ $oAddr->host = false;
+ }
+ $sEmail = '';
+ $aStack = $aComment = array();
+ return $oAddr;
+ }
+
+ /*
+ * parseAddress: recursive function for parsing address strings and store
+ * them in an address stucture object.
+ * input: $address = string
+ * $ar = boolean (return array instead of only the
+ * first element)
+ * $addr_ar = array with parsed addresses // obsolete
+ * $group = string // obsolete
+ * $host = string (default domainname in case of
+ * addresses without a domainname)
+ * $lookup = callback function (for lookup address
+ * strings which are probably nicks
+ * (without @ ) )
+ * output: array with addressstructure objects or only one
+ * address_structure object.
+ * personal name: encoded: =?charset?Q|B?string?=
+ * quoted: "string"
+ * normal: string
+ * email : <mailbox@host>
+ * : mailbox@host
+ * This function is also used for validating addresses returned from compose
+ * That's also the reason that the function became a little bit huge
+ */
+
+ function parseAddress($address,$ar=false,$aAddress=array(),$sGroup='',$sHost='',$lookup=false) {
+ $aTokens = $this->getAddressTokens($address);
+ $sPersonal = $sEmail = $sComment = $sGroup = '';
+ $aStack = $aComment = array();
+ foreach ($aTokens as $sToken) {
+ $cChar = $sToken{0};
+ switch ($cChar)
+ {
+ case '=':
+ case '"':
+ case ' ':
+ $aStack[] = $sToken;
+ break;
+ case '(':
+ $aComment[] = substr($sToken,1,-1);
+ break;
+ case ';':
+ if ($sGroup) {
+ $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup);
+ $oAddr = end($aAddress);
+ if(!$oAddr || ((isset($oAddr)) && !$oAddr->mailbox && !$oAddr->personal)) {
+ $sEmail = $sGroup . ':;';
+ }
+ $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup);
+ $sGroup = '';
+ $aStack = $aComment = array();
+ break;
+ }
+ case ',':
+ $aAddress[] = $this->createAddressObject($aStack,$aComment,$sEmail,$sGroup);
+ break;
+ case ':':
+ $sGroup = trim(implode(' ',$aStack));
+ $sGroup = preg_replace('/\s+/',' ',$sGroup);
+ $aStack = array();
+ break;
+ case '<':
+ $sEmail = trim(substr($sToken,1,-1));
+ break;
+ case '>':
+ /* skip */
+ break;
+ default: $aStack[] = $sToken; break;