
本文介绍如何在解析 ark 服务器返回的 json 数据时,安全跳过空字符串或空白字符构成的无效玩家名称,并结合时间格式化逻辑生成干净、专业的前端显示效果。
本文介绍如何在解析 ark 服务器返回的 json 数据时,安全跳过空字符串或空白字符构成的无效玩家名称,并结合时间格式化逻辑生成干净、专业的前端显示效果。
在处理游戏服务器(如 ARK: Survival Evolved)返回的 JSON 状态数据时,常会遇到 players 数组中包含名称为空("")、仅含不可见 Unicode 字符(如零宽空格 ᠌)甚至全空白字符的情况。若直接渲染这些“伪玩家”,不仅影响页面美观,还可能引发后续逻辑异常(例如 sprintf() 对非法 $rawtimeconv 的处理)。
你当前的循环代码如下:
<?php
foreach ($serverstatus->players as $player) {
echo('<h5 class="dark">');
$rawtimeconv = $player->raw->time;
$rawtimeconv = round($rawtimeconv);
$output = sprintf('%02dh:%02dm:%02ds', ($rawtimeconv / 3600), ($rawtimeconv / 60 % 60), $rawtimeconv % 60);
echo $player->name . ": ";
echo $output;
echo "</h5><br>";
}
?>该逻辑存在两个关键风险点:
- 空名未过滤:$player->name 可能为 "" 或仅含空白/控制字符(如示例中的 ᠌),导致显示 ": 00h:00m:00s";
- 缺失 raw->time 字段:部分空玩家对象中 "raw": {} 为空对象,访问 $player->raw->time 将触发 PHP Notice(如 Trying to get property 'time' of non-object)。
✅ 正确做法是:在循环体开头添加双重校验——既检查名称是否有效,也确保 raw->time 存在且为数值:
立即学习“PHP免费学习笔记(深入)”;
<?php
foreach ($serverstatus->players as $player) {
// 跳过名称为空、纯空白或非字符串类型的情况
if (!is_string($player->name) || trim($player->name) === '') {
continue;
}
// 跳过 raw 不存在,或 raw->time 不存在/非数字的情况
if (!isset($player->raw) || !isset($player->raw->time) || !is_numeric($player->raw->time)) {
continue;
}
echo('<h5 class="dark">');
$rawtimeconv = (float)$player->raw->time; // 强制转为浮点数,避免类型隐患
$rawtimeconv = round($rawtimeconv);
// 注意:整除与取模需用 floor() 防止浮点误差(如 3600.9999 → 3601)
$hours = floor($rawtimeconv / 3600);
$minutes = floor(($rawtimeconv % 3600) / 60);
$seconds = $rawtimeconv % 60;
$output = sprintf('%02dh:%02dm:%02ds', $hours, $minutes, $seconds);
echo htmlspecialchars($player->name, ENT_QUOTES, 'UTF-8') . ": " . $output;
echo "</h5><br>";
}
?>? 关键改进说明:
- trim($player->name) === '' 可同时过滤 ""、" "、"\t\n" 及 Unicode 空格(如 ᠌ 在 trim() 默认字符集中会被清除);
- htmlspecialchars() 防止 XSS,尤其当玩家名含 <script> 等恶意标签时;</script>
- 使用 floor() 替代浮点除法直接参与 sprintf,规避因 IEEE 754 浮点精度导致的小时/分钟错位(例如 7199.9999 被误判为 2h 而非 1h);
- 显式类型检查(is_numeric, is_string)提升健壮性,适配各类边缘 JSON 结构。
? 进阶建议:若需彻底剔除含不可见字符的名称(如 ᠌、、),可补充正则过滤:
if (!preg_match('/^\S+$/u', $player->name)) {
continue;
}该正则确保名称至少含一个非空白 Unicode 字符,兼顾多语言与安全性。
通过以上优化,你的服务器玩家列表将严格只展示真实、有效、可安全渲染的在线用户,大幅提升数据可信度与用户体验。











