thinkphp 框架本身不提供内置的全角半角转换函数;实际需用 php 原生方法实现,推荐手动映射表结合 str_replace(),或使用 mb_convert_kana()(仅限日文环境有效),并注意全角空格、中文标点等边界问题。

ThinkPHP 里没有内置的全角半角转换函数
直接说结论:ThinkPHP 框架本身(包括 5.0、5.1、6.0、6.1)不提供类似 str_full2half() 或 str_half2full() 这样的内置字符串转换函数。你搜到的所谓“ThinkPHP 全角转半角”示例,基本都是在用 PHP 原生函数或第三方工具拼凑,不是框架原生能力。
实际可用的三种方案及选择建议
遇到输入框提交全角数字/字母/符号(比如“123ABC”、“,。”),需要统一转为半角处理时,推荐按优先级选:
- 优先用
mb_convert_kana()(PHP 内置,仅限日文环境有效,中文 Windows/Linux 下常失效或报错) - 次选用正则替换 + 手动映射表,稳定可控,兼容所有 PHP 版本和系统
- 慎用
iconv()转码(如iconv('UTF-8', 'ASCII//IGNORE', $str)),它只删非 ASCII 字符,不转换全角标点,且会丢数据
一个轻量可靠的半角化函数示例如下(可直接放进 app/common.php 或工具类中):
function str_full2half(string $str): string
{
$map = [
'0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4',
'5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9',
'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E',
'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J',
'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O',
'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T',
'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 'Z' => 'Z',
'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e',
'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j',
'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 'o' => 'o',
'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't',
'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y', 'z' => 'z',
',' => ',', '。' => '.', '!' => '!', '?' => '?', ';' => ';',
':' => ':', '“' => '"', '”' => '"', '‘' => '\'', '’' => '\'',
'(' => '(', ')' => ')', '【' => '[', '】' => ']', '《' => ' '>',
'~' => '~', '¥' => '$', '%' => '%', '+' => '+', '-' => '-',
'=' => '=', '&' => '&', '<' => ' '>', '*' => '*',
];
return str_replace(array_keys($map), array_values($map), $str);
}
在 ThinkPHP 控制器或验证器里怎么调用
别想着找框架封装好的方法,直接当普通 PHP 函数用即可。常见场景是接收用户输入后预处理:
- 在控制器中:
$data['phone'] = str_full2half($this->request->post('phone')); - 在验证器规则里不能直接写函数调用,需自定义验证规则或在
scene处理逻辑中先转换再验证 - 注意:该函数不处理空格(全角空格
需单独加映射),也不处理制表符、换行符等控制字符
容易被忽略的边界问题
全角半角转换看着简单,但真实业务里几个坑很隐蔽:
- 全角空格
(U+3000)不是空格(U+0020),trim()和empty()对它无效,必须显式替换 - 中文破折号
——、省略号……不在常规映射表里,若业务涉及合同/文本比对,得额外补充 - 部分手机输入法会输出「全角英文字母 + 半角标点」混排,单靠一次转换不够,建议在入库前统一过一遍
- 如果字段要走数据库唯一索引(比如邮箱、手机号),必须确保转换逻辑在
INSERT和SELECT WHERE两边完全一致,否则查不到
真正麻烦的从来不是写转换函数,而是确认业务里到底有哪些字符要转、哪些要保留、哪些要报错——这得翻产品需求和历史数据样本,不是查文档能解决的。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











