在PHP开发中,处理带@符号的头信息字符串是常见需求,这类字符串通常出现在自定义请求头、第三方接口返回的头信息中,@符号可能作为分隔符或者特殊标识存在,需要针对性的解析逻辑来提取对应的键值对。
带@符号的头信息字符串常见格式
常见的带@符号的头信息字符串格式有以下几种:
- 键值对用@分隔:
user_id=123@user_name=test@role=admin - @作为键的前缀:
@token=abc123@expire=3600 - @作为值的一部分:
email=user@ipipp.com@sign=xxx
通用解析方法实现
我们可以根据@符号的位置和头信息的整体结构,先拆分字符串再提取键值对,以下是通用的解析函数:
<?php
/**
* 解析带@符号的头信息字符串并提取键值对
* @param string $headerStr 待解析的头信息字符串
* @return array 提取后的键值对数组
*/
function parseAtHeaderString($headerStr) {
$result = [];
// 去除首尾空白字符
$trimmedStr = trim($headerStr);
if (empty($trimmedStr)) {
return $result;
}
// 按@符号拆分字符串片段
$segments = explode('@', $trimmedStr);
foreach ($segments as $segment) {
$segment = trim($segment);
if (empty($segment)) {
continue;
}
// 查找等号位置,拆分键和值
$eqPos = strpos($segment, '=');
if ($eqPos !== false) {
$key = substr($segment, 0, $eqPos);
$value = substr($segment, $eqPos + 1);
// 去除键和值的前后空白
$key = trim($key);
$value = trim($value);
if (!empty($key)) {
$result[$key] = $value;
}
} else {
// 没有等号的片段可以作为无值键处理
$result[$segment] = '';
}
}
return $result;
}
// 测试示例1:键值对用@分隔的场景
$testStr1 = 'user_id=123@user_name=test@role=admin';
$res1 = parseAtHeaderString($testStr1);
print_r($res1);
// 测试示例2:@作为键前缀的场景
$testStr2 = '@token=abc123@expire=3600';
$res2 = parseAtHeaderString($testStr2);
print_r($res2);
// 测试示例3:@作为值一部分的场景
$testStr3 = 'email=user@ipipp.com@sign=xxx';
$res3 = parseAtHeaderString($testStr3);
print_r($res3);
?>
特殊场景处理
如果头信息字符串中@符号存在转义或者嵌套的情况,比如content=test@demo@time=123,上面的基础函数会把转义的@也作为分隔符,此时需要先处理转义字符:
<?php
/**
* 处理带转义@符号的头信息解析
* @param string $headerStr 待解析的头信息字符串
* @return array 提取后的键值对数组
*/
function parseEscapedAtHeaderString($headerStr) {
$result = [];
$trimmedStr = trim($headerStr);
if (empty($trimmedStr)) {
return $result;
}
// 先把转义的@替换成临时占位符,避免被误拆分
$placeholder = '___AT_PLACEHOLDER___';
$processedStr = str_replace('@', $placeholder, $trimmedStr);
// 按@拆分片段
$segments = explode('@', $processedStr);
foreach ($segments as $segment) {
$segment = trim($segment);
if (empty($segment)) {
continue;
}
// 把临时占位符还原为@
$segment = str_replace($placeholder, '@', $segment);
$eqPos = strpos($segment, '=');
if ($eqPos !== false) {
$key = substr($segment, 0, $eqPos);
$value = substr($segment, $eqPos + 1);
$key = trim($key);
$value = trim($value);
if (!empty($key)) {
$result[$key] = $value;
}
} else {
$result[$segment] = '';
}
}
return $result;
}
// 测试转义场景
$testStr = 'content=test@demo@time=123';
$res = parseEscapedAtHeaderString($testStr);
print_r($res);
?>
注意事项
在实际使用中需要注意以下几点:
- 如果头信息字符串的编码不是UTF-8,需要先转码再解析,避免出现乱码导致拆分错误
- 解析完成后可以对键值对做合法性校验,比如判断必填键是否存在,值是否符合预期格式
- 如果头信息字符串长度较长,建议先判断长度再做解析,避免无效计算
解析头信息字符串时,一定要先明确头信息的格式规范,再选择对应的解析逻辑,避免通用逻辑适配不了特殊场景。