我正在编写一个通过 Sockets 与 SMTP 服务器通信的脚本,并且我正在尝试实现 DIGEST-MD5 身份验证,但是我无法解析在 AUTH 命令之后返回的字符串。
之后base64_decode()
它看起来像:
realm="smtp.domain.net",nonce="AJRUc5Jx0UQbv5SJ9FoyUnaZpqZIHDhLTU+Awn/K0Uw=",qop="auth,auth-int",charset=utf-8,algorithm=md5-sess
我想使用str_getcsv()
,但服务器仍然在 PHP 5.2 上,所以我从 PHP.net 上的评论中得到了以下代码,看起来还不错:
<?php
if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter=',', $enclosure='"', $escape=null, $eol=null) {
$temp=fopen("php://memory", "rw");
fwrite($temp, $input);
fseek($temp, 0);
$r = array();
while (($data = fgetcsv($temp, 4096, $delimiter, $enclosure)) !== false) {
$r[] = $data;
}
fclose($temp);
return $r;
}
}
但它返回以下内容:
array (
0 =>
array (
0 => 'realm="smtp.domain.net"',
1 => 'nonce="2PuESkmrNzGu/5b8N6eIYQoW7mSlScnYAB/PSYebkYo="',
2 => 'qop="auth',
3 => 'auth-int"',
4 => 'charset=utf-8',
5 => 'algorithm=md5-sess',
),
)
请注意,索引 2 和 3 应该是单个qop="auth,auth-int"
.
在写这篇文章时,我意识到可能fgetcsv()
期望$enclosure
字符包含整个字段而不仅仅是其中的一部分,但在这种情况下,我必须知道如何正确解析这个字符串。