PHP将游戏内嵌{rrggbb}颜色标记转换为<span>彩色文本的实现问询
嘿,这个需求我之前做游戏社区工具的时候刚好碰到过,给你分享一套实用的PHP实现方案,完美解决你的转换需求:
核心思路回顾
你说的逻辑完全正确:
- 第一个颜色标记 → 替换为
<span style="color:#RRGGBB"> - 后续每个颜色标记 → 先闭合上一个span,再开新的:
</span><span style="color:#RRGGBB"> - 最后必须补一个
</span>来闭合最后一个颜色块
实现代码(两种方案可选)
方案1:分阶段替换(直观易读)
function convertGameColoredText($gameText) { // 匹配游戏颜色标记的正则:{6位十六进制颜色码} $colorPattern = '/{([0-9a-fA-F]{6})}/'; // 先检查有没有颜色标记,没有直接返回原文本 $colorCount = preg_match_all($colorPattern, $gameText, $_); if ($colorCount === 0) { return $gameText; } // 第一步:替换第一个颜色标记为span开启标签 $convertedText = preg_replace($colorPattern, '<span style="color:#$1">', $gameText, 1); // 第二步:替换剩余所有颜色标记为「闭合+开启」的组合 $convertedText = preg_replace($colorPattern, '</span><span style="color:#$1">', $convertedText); // 第三步:给最后一个颜色块补闭合标签 $convertedText .= '</span>'; return $convertedText; } // 测试用例 $testInput = "{ff0000}红色文本 {00ff00}绿色文本 {ffff00}黄色文本"; echo convertGameColoredText($testInput);
方案2:回调函数替换(更简洁)
用preg_replace_callback可以一次性处理所有替换逻辑,代码更紧凑:
function convertGameColoredText($gameText) { $isFirstColor = true; $convertedText = preg_replace_callback( '/{([0-9a-fA-F]{6})}/i', // 加i修饰符忽略大小写,兼容FF0000和ff0000 function($matches) use (&$isFirstColor) { $colorCode = $matches[1]; if ($isFirstColor) { $isFirstColor = false; return "<span style='color:#{$colorCode}'>"; } return "</span><span style='color:#{$colorCode}'>"; }, $gameText ); // 如果有过颜色替换,补闭合标签 if (!$isFirstColor) { $convertedText .= '</span>'; } return $convertedText; }
注意事项
- 正则里的
[0-9a-fA-F]{6}确保只匹配合法的6位十六进制颜色码,避免误替换普通文本里的{xxxxxx}格式内容 - 方案2里的
i修饰符可以兼容游戏里大小写混合的颜色码(比如{FF0000}和{ff0000}都能识别) - 如果游戏里有
{fff}这种3位简写颜色码,只需把正则改成{([0-9a-fA-F]{3,6})},然后在回调里处理3位转6位的逻辑(比如把fff转成ffffff)
内容的提问来源于stack exchange,提问作者Vojthas
相关产品推荐
相关产品推荐

