array( value => string, charset => string, * language => string ) ) ); */ public static function parseHeader( $header ) { $result = array(); // argument if ( preg_match( '/^\s*([^;]*);?/i', $header, $matches ) ) { $result[0] = $matches[1]; } // We must go through all parameters and store this data because // parameters can be unordered. We will store them in this buffer // array( paramName => array( array( value => string, encoding ) ) ) $parameterBuffer = array(); // parameters if ( preg_match_all( '/\s*(\S*)="?([^;"]*);?/i', $header, $matches, PREG_SET_ORDER ) ) { foreach ( $matches as $parameter ) { // if normal parameter, simply add it if ( !preg_match( '/([^\*]+)\*(\d+)?(\*)?/', $parameter[1], $metaData ) ) { $result[1][$parameter[1]] = array( 'value' => $parameter[2] ); } else // coded and/or folded { // metaData [1] holds the param name // metaData [2] holds the count or is not set in case of charset only // metaData [3] holds '*' if there is charset in addition to folding if ( isset( $metaData[2] ) ) // we have folding { $parameterBuffer[$metaData[1]][$metaData[2]]['value'] = $parameter[2]; $parameterBuffer[$metaData[1]][$metaData[2]]['encoding'] = isset( $metaData[3] ) ? true : false;; } else { $parameterBuffer[$metaData[1]][0]['value'] = $parameter[2]; $parameterBuffer[$metaData[1]][0]['encoding'] = true; } } } // whohooo... we have all the parameters nicely sorted. // Now we must go through them all and convert them into the end result foreach ( $parameterBuffer as $paramName => $parts ) { // fetch language and encoding if we have it // syntax: '[charset]'[language]'encoded_string $language = null; $charset = null; if ( $parts[0]['encoding'] == true ) { preg_match( "/(\S*)'(\S*)'(.*)/", $parts[0]['value'], $matches ); $charset = $matches[1]; $language = $matches[2]; $parts[0]['value'] = urldecode( $matches[3] ); // rewrite value: todo: decoding $result[1][$paramName] = array( 'value' => $parts[0]['value'] ); } $result[1][$paramName] = array( 'value' => $parts[0]['value'] ); if ( strlen( $charset ) > 0 ) { $result[1][$paramName]['charset'] = $charset; } if ( strlen( $language ) > 0 ) { $result[1][$paramName]['language'] = $language; } if ( count( $parts > 1 ) ) { for( $i = 1; $i < count( $parts ); $i++ ) { $result[1][$paramName]['value'] .= $parts[$i]['encoding'] ? urldecode( $parts[$i]['value'] ) : $parts[$i]['value']; } } } } return $result; } /** * Returns the a ezcMailContentDispositionHeader for the parsed $header. * * If $cd is provided this object will be used to fill in the blanks. This function * will not clear out any old values in the object. * * @param string $header * @return ezcMailContentDispositionHeader */ public static function parseContentDisposition( $header, ezcMailContentDispositionHeader $cd = null ) { if ( $cd === null ) { $cd = new ezcMailContentDispositionHeader(); } $parsedHeader = self::parseHeader( $header ); $cd->disposition = $parsedHeader[0]; if ( isset( $parsedHeader[1] ) ) { foreach ( $parsedHeader[1] as $paramName => $data ) { switch ( $paramName ) { case 'filename': $cd->fileName = $data['value']; if ( isset( $data['charset'] ) ) { $cd->fileNameCharSet = $data['charset']; } if ( isset( $data['language'] ) ) { $cd->fileNameLanguage = $data['language']; } break; case 'creation-date': $cd->creationDate = $data['value']; break; case 'modification-date': $cd->modificationDate = $data['value']; break; case 'read-date': $cd->readDate = $data['value']; break; case 'size': $cd->size = $data['value']; break; default: $cd->additionalParameters[$paramName] = $data['value']; if ( isset( $data['charset'] ) ) { $cd->additionalParametersMetaData[$paramName]['charSet'] = $data['charset']; } if ( isset( $data['language'] ) ) { $cd->additionalParametersMetaData[$paramName]['language'] = $data['language']; } break; } } } return $cd; } } ?>