如何在 PHP 中过滤 JSON 数据中的空玩家名称并优雅渲染游戏服务器状态

2次阅读

如何在 PHP 中过滤 JSON 数据中的空玩家名称并优雅渲染游戏服务器状态

本文介绍如何在解析 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 为空、纯空白或无字母的条目被静默跳过,仅展示真实活跃玩家,输出干净、安全、专业。

text=ZqhQzanResources