提取 AWS 授权标头字符串的重要部分

问题描述 投票:0回答:2

我的输入字符串:

AWS-HMAC-SHA256 Credential=eyJhbGciOiJIUzI1NiIsIngtc3MiOjEy/20160911/cn/user-service/request,SignedHeaders=host;x-aws-date, Signature=d9ee2d43f2067e4b8857f15fa8fff27820051d95a4ec31e93be866f201e0797a

如何获取

Credential
SignedHeaders
Signature
的值?

php preg-match-all text-extraction authorization-header
2个回答
0
投票

您可以使用 explodearray_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
)

演示


0
投票

该常规/可预测格式的字符串是“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()
将是一项相对繁琐的工作,以确保键值关系。

© www.soinside.com 2019 - 2024. All rights reserved.