我的输入字符串:
AWS-HMAC-SHA256 Credential=eyJhbGciOiJIUzI1NiIsIngtc3MiOjEy/20160911/cn/user-service/request,SignedHeaders=host;x-aws-date, Signature=d9ee2d43f2067e4b8857f15fa8fff27820051d95a4ec31e93be866f201e0797a
如何获取
Credential
、SignedHeaders
和 Signature
的值?
您可以使用 explode 和 array_map,而不是使用正则表达式:
$str = "AWS-HMAC-SHA256 Credential=eyJhbGciOiJIUzI1NiIsIngtc3MiOjEy/20160911/cn/user-service/request,SignedHeaders=host;x-aws-date, Signature=d9ee2d43f2067e4b8857f15fa8fff27820051d95a4ec31e93be866f201e0797a";
$res = array_map(function($x){
return explode('=', $x)[1];
}, explode(',', $str));
print_r($res);
结果:
Array
(
[0] => eyJhbGciOiJIUzI1NiIsIngtc3MiOjEy/20160911/cn/user-service/request
[1] => host;x-aws-date
[2] => d9ee2d43f2067e4b8857f15fa8fff27820051d95a4ec31e93be866f201e0797a
)
该常规/可预测格式的字符串是“AWS 授权标头”或“AWS 签名版本 4 标头”。
您可以使用
sscanf()
:(演示)
$str = "AWS-HMAC-SHA256 Credential=eyJhbGciOiJIUzI1NiIsIngtc3MiOjEy/20160911/cn/user-service/request,SignedHeaders=host;x-aws-date, Signature=d9ee2d43f2067e4b8857f15fa8fff27820051d95a4ec31e93be866f201e0797a";
var_export(
sscanf(
$str,
'AWS-HMAC-SHA256 Credential=%[^,],SignedHeaders=%[^,], Signature=%[^,]'
)
);
还有一种替代语法,您可以提供引用变量来填充匹配的值。 (演示)
sscanf(
$str,
'AWS-HMAC-SHA256 Credential=%[^,],SignedHeaders=%[^,], Signature=%[^,]',
$credentials,
$headers,
$signature
);
var_dump($credentials, $headers, $signature);
要使用几乎 ini 格式的文本中的精确键和值对创建关联数组,请在将格式调整为单独的行后使用
parse_ini_string()
。这将更加宽容分隔符或不同顺序组件周围的可选空间。 (演示)
var_export(
parse_ini_string(
preg_replace('/[, ]+/', "\n", $str)
)
);
输出:
array (
'Credential' => 'eyJhbGciOiJIUzI1NiIsIngtc3MiOjEy/20160911/cn/user-service/request',
'SignedHeaders' => 'host',
'Signature' => 'd9ee2d43f2067e4b8857f15fa8fff27820051d95a4ec31e93be866f201e0797a',
)
使用
preg_match_all()
对于命名捕获组来说有点太麻烦了;并且 preg_split()
将是一项相对繁琐的工作,以确保键值关系。