PHP Conference Japan 2024

iconv_mime_decode_headers

(PHP 5, PHP 7, PHP 8)

iconv_mime_decode_headers一次解码多个MIME报头字段

描述

iconv_mime_decode_headers(字符串 $headers, 整数 $mode = 0, ?字符串 $encoding = null): 数组|false

一次解码多个MIME报头字段。

参数

headers

编码的报头,作为字符串。

mode

mode确定当iconv_mime_decode_headers()遇到格式错误的MIME报头字段时的行为。您可以指定以下任何位掩码组合。

iconv_mime_decode_headers() 可接受的位掩码
常量 描述
1 ICONV_MIME_DECODE_STRICT 如果设置,则给定的报头将完全符合» RFC2047中定义的标准进行解码。默认情况下此选项被禁用,因为有很多损坏的邮件用户代理不遵循规范且不会生成正确的MIME报头。
2 ICONV_MIME_DECODE_CONTINUE_ON_ERROR 如果设置,iconv_mime_decode_headers()尝试忽略任何语法错误并继续处理给定的报头。

encoding

可选的encoding参数指定用于表示结果的字符集。如果省略或为null,则将使用iconv.internal_encoding

返回值

成功时返回一个关联数组,其中包含headers指定的MIME报头字段的完整集合;如果解码过程中发生错误,则返回false

返回值的每个键表示一个单独的字段名称,相应的元素表示字段值。如果存在多个相同名称的字段,iconv_mime_decode_headers()会自动按出现顺序将它们合并到一个数字索引数组中。请注意,报头名称不区分大小写。

变更日志

版本 描述
8.0.0 encoding现在可以为空。

范例

示例 #1 iconv_mime_decode_headers() 示例

<?php
$headers_string
= <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: [email protected]
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <[email protected]>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <[email protected]>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from [email protected])
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000

EOF;

$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");
print_r($headers);
?>

以上示例将输出

Array
(
    [Subject] => Prüfung Prüfung
    [To] => [email protected]
    [Date] => Thu, 1 Jan 1970 00:00:00 +0000
    [Message-Id] => <[email protected]>
    [Received] => Array
        (
            [0] => from localhost (localhost [127.0.0.1]) by localhost with SMTP id example for <[email protected]>; Thu, 1 Jan 1970 00:00:00 +0000 (UTC) (envelope-from [email protected])
            [1] => (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000
        )

)

参见

添加注释

用户贡献注释 2 个注释

0
phpmanual at NOSPAM dot headbank dot co dot uk
5 天前
以防万一这能帮到其他人:如果您的报头字符串有任何前导换行符,此函数将拒绝它并返回一个空数组。如果这可能适用于您的输入,请使用 ltrim() 对其进行清理。

尾随空行会被容忍/忽略。

我现在注意到的其他一些特性

1. 第一行中的前导空格(“ ”或“\t”)将包含在返回数组中报头的键名中。ltrim() 也可以防止这种情况。

2. 任何后续报头中的前导空格(键之前)会导致该行附加到前面报头的值,就像它是该报头的续行一样。
0
TheConstructor
14 年前
如果您需要小写的报头名称(正如我阅读的文档中大小写没有保证的那样),请尝试以下操作

<?php

$headers_string
= <<<EOF
Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=
To: [email protected]
Date: Thu, 1 Jan 1970 00:00:00 +0000
Message-Id: <[email protected]>
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <[email protected]>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from [email protected])
Received: (qmail 0 invoked by uid 65534); 1 Thu 2003 00:00:00 +0000

EOF;

$headers = iconv_mime_decode_headers($headers_string, 0, "ISO-8859-1");

$headers = array_combine(array_map("strtolower", array_keys($headers)), array_values($headers));

print_r($headers);
?>
To Top