| | |
| | | default: |
| | | //quoted-printable encoding has been selected |
| | | |
| | | //Generate the header using the specified params and dynamicly |
| | | //determine the maximum length of such strings. |
| | | //75 is the value specified in the RFC. The -2 is there so |
| | | //the later regexp doesn't break any of the translated chars. |
| | | $prefix = '=?' . $this->_build_params['head_charset'] . '?Q?'; |
| | | $suffix = '?='; |
| | | $maxLength = 75 - strlen($prefix . $suffix) - 2; |
| | | $maxLength1stLine = $maxLength - strlen($hdr_name); |
| | | |
| | | //Replace all special characters used by the encoder. |
| | | $search = array("=", "_", "?", " "); |
| | | $replace = array("=3D", "=5F", "=3F", "_"); |
| | | $hdr_value = str_replace($search, $replace, $hdr_value); |
| | | |
| | | //Replace all extended characters (\x80-xFF) with their |
| | | //ASCII values. |
| | | $hdr_value = preg_replace( |
| | | '#([\x80-\xFF])#e', |
| | | '"=" . strtoupper(dechex(ord("\1")))', |
| | | $hdr_value |
| | | ); |
| | | //This regexp will break QP-encoded text at every $maxLength |
| | | //but will not break any encoded letters. |
| | | $reg1st = "|(.{0,$maxLength})[^\=]|"; |
| | | $reg2nd = "|(.{0,$maxLength})[^\=]|"; |
| | | break; |
| | | } |
| | | //Begin with the regexp for the first line. |
| | | $reg = $reg1st; |
| | | $output = ""; |
| | | while ($hdr_value) { |
| | | //Split translated string at every $maxLength |
| | | //But make sure not to break any translated chars. |
| | | $found = preg_match($reg, $hdr_value, $matches); |
| | | |
| | | //After this first line, we need to use a different |
| | | //regexp for the first line. |
| | | $reg = $reg2nd; |
| | | |
| | | //Save the found part and encapsulate it in the |
| | | //prefix & suffix. Then remove the part from the |
| | | //$hdr_value variable. |
| | | if ($found){ |
| | | $part = $matches[0]; |
| | | $hdr_value = substr($hdr_value, strlen($matches[0])); |
| | | }else{ |
| | | $part = $hdr_value; |
| | | $hdr_value = ""; |
| | | preg_match_all('/(\w*[\x80-\xFF]+\w*)/', $hdr_value, $matches); |
| | | foreach ($matches[1] as $value) { |
| | | $replacement = preg_replace('/([\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value); |
| | | $hdr_value = str_replace($value, '=?' . $this->_build_params['head_charset'] . '?Q?' . $replacement . '?=', $hdr_value); |
| | | } |
| | | |
| | | //RFC 2047 specifies that any split header should be seperated |
| | | //by a CRLF SPACE. |
| | | if ($output){ |
| | | $output .= "\r\n "; |
| | | } |
| | | $output .= $prefix . $part . $suffix; |
| | | } |
| | | $hdr_value = $output; |
| | | } |
| | | |
| | | $input[$hdr_name] = $hdr_value; |
| | | } |
| | | |