
本文介绍如何在解析 Ark 游戏服务器返回的 JSON 数据时,安全跳过空字符串或空白字符构成的无效玩家名称,避免前端显示冗余的 : 00h:00m:00s 条目,并提供健壮的时间格式化与数据清洗实践。
本文介绍如何在解析 ark 游戏服务器返回的 json 数据时,安全跳过空字符串或空白字符构成的无效玩家名称,避免前端显示冗余的 `: 00h:00m:00s` 条目,并提供健壮的时间格式化与数据清洗实践。
在使用 PHP 展示游戏服务器(如 ARK: Survival Evolved)实时玩家列表时,常见问题是服务端返回的 players 数组中包含大量 name 字段为空("")、仅含不可见 Unicode 字符(如零宽空格 ᠌)或纯空白字符的“伪玩家”条目。这类数据通常源于连接中的客户端、Bot 占位符或协议兼容性填充,若直接渲染,会导致页面出现无意义的 : 00h:00m:00s 行,影响用户体验与数据可信度。
解决核心在于在遍历前对玩家名称做有效性校验,而非仅依赖 strlen() 判断空字符串。因为 strlen("") === 0 成立,但 strlen("᠌") !== 0(该字符占 3 字节),而语义上它仍是无效名称。因此推荐采用更严谨的清洗策略:
<?php
foreach ($serverstatus->players as $player) {
// ✅ 强健过滤:去除首尾空白 + 判空 + 排除仅含不可见字符的情况
$cleanName = trim($player->name);
if (empty($cleanName) || !preg_match('/\p{L}/u', $cleanName)) {
continue; // 跳过无效名称
}
echo('<h5 class="dark">');
// ✅ 安全读取 time 字段,防止缺失时触发 Notice
$rawTime = $player->raw->time ?? 0;
$rawTime = round((float)$rawTime);
// ✅ 使用 floor 避免浮点误差导致分钟/小时溢出(如 59.999 → 60)
$hours = floor($rawTime / 3600);
$minutes = floor(($rawTime % 3600) / 60);
$seconds = $rawTime % 60;
$output = sprintf('%02dh:%02dm:%02ds', $hours, $minutes, $seconds);
echo htmlspecialchars($cleanName, ENT_QUOTES, 'UTF-8') . ': ' . $output;
echo "</h5><br>";
}
?>关键优化说明:
- trim() 消除前后空格、制表符、换行等;
- empty() 同时覆盖 null、""、0、"0" 等假值(此处语义合理);
- 正则 \p{L} 匹配任意 Unicode 字母,确保名称至少含一个可读字符,有效拦截 ᠌、、 等隐形字符;
- ?? 0 和 (float) 强制类型转换防止 null 或非数字引发 Division by zero 或警告;
- htmlspecialchars() 防止 XSS,尤其当玩家名含 <script> 等恶意输入时; </script>
- 使用 floor() 替代 % 运算中的浮点模运算,规避 round(3599.999) % 60 可能得 60 的边界错误。
额外建议:
若需进一步提升健壮性,可在 JSON 解析后统一预处理玩家数组:
$validPlayers = array_filter($serverstatus->players, function($p) {
return !empty(trim($p->name)) && preg_match('/\p{L}/u', trim($p->name));
});
$serverstatus->players = array_values($validPlayers); // 重索引此举将过滤逻辑与渲染分离,利于测试与复用。
立即学习“PHP免费学习笔记(深入)”;
最终效果:所有 name 为空、纯空白或无字母的条目被静默跳过,仅展示真实活跃玩家,输出干净、安全、专业。











