我需要解析一个由字母和数字交替组成的字符串,并填充一个数组,其中字母是键,数字是值。
的例子:
p10s2z1234
输出Array(
'p' => 10,
's' => 2,
'z' => 1234
)
使用正则表达式获取所需的值,然后将数组组合为关联数组。例如:
$str = 'p10s2z1234';
preg_match_all('/([a-z]+)('d+)/', $str, $matches); //handles only lower case chars. feel free to extend regex
print_r(array_combine($matches[1], $matches[2]));
场景1:您希望解析一个字符串,该字符串有单个字母作为键,将生成三对值,并且您希望将数字转换为整数。那么,最好、最直接的方法是sscanf()
,它带有数组解构——一个函数调用就可以完成所有工作。(演示)
$str = 'p10s2z1234';
[
$k1,
$result[$k1],
$k2,
$result[$k2],
$k3,
$result[$k3]
] = sscanf($str, '%1s%d%1s%d%1s%d');
var_export($result);
输出:array (
'p' => 10,
's' => 2,
'z' => 1234,
)
场景2:您希望与场景1相同的解析和输出,但是作为键的子字符串具有可变/未知长度。(演示)
$str = 'pie10sky2zebra1234';
[
$k1,
$result[$k1],
$k2,
$result[$k2],
$k3,
$result[$k3]
] = sscanf($str, '%[^0-9]%d%[^0-9]%d%[^0-9]%d');
var_export($result);
场景3:你想用正则表达式解析字符串,不关心值是"string"数据类型。(演示)
$str = 'pie10sky2zebra1234';
[
$k1,
$result[$k1],
$k2,
$result[$k2],
$k3,
$result[$k3]
] = preg_split('/('d+)/', $str, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
var_export($result);
场景4:如果您不知道输入字符串将生成多少对,则使用array_combine()
。(演示)
$str = 'pie10sky2zebra1234extra999';
var_export(
preg_match_all('/('D+)('d+)/', $str, $m)
? array_combine($m[1], $m[2])
: []
);