PHP匹配日文全角数字正则表达式返回所有全角字符问题
问题分析与解决方案
你的代码核心问题是正则表达式未添加u修饰符,PHP的preg系列函数默认按字节处理字符串,全角数字是Unicode多字节字符,不加u修饰符时,[0-9]的范围会被解析为字节范围,导致误匹配其他全角字符。
修正步骤与优化代码
- 修复正则表达式,添加
u修饰符以支持Unicode字符匹配 - 无需拆分字符串再过滤,直接用
preg_match_all一次性提取所有全角数字,提升效率 - 加入全角数字转半角的逻辑
修正后的完整代码:
// 匹配全角数字的正则,添加u修饰符支持Unicode $fullwidthPattern = '/[0-9]/u'; $handle = curl_init(); $url = (URL removed for privacy reasons); curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($handle); curl_close($handle); // 提取所有全角数字 preg_match_all($fullwidthPattern, $output, $matches); $fullwidthNumbers = $matches[0]; // 全角转半角:全角数字(0-9)的Unicode值比半角(0-9)大0xFEE0 $halfwidthNumbers = array_map(function($num) { return chr(ord($num) - 0xFEE0); }, $fullwidthNumbers); // 输出结果 echo '提取的全角数字:' . implode('', $fullwidthNumbers) . PHP_EOL; echo '转换后的半角数字:' . implode('', $halfwidthNumbers);
关键说明
u修饰符:让正则引擎按Unicode字符而非字节处理,确保[0-9]准确匹配全角数字(U+FF10到U+FF19)preg_match_all:直接从网页内容中提取所有符合规则的全角数字,避免拆分字符串的额外开销- 全角转半角逻辑:利用全角与半角数字的Unicode值偏移量(固定差0xFEE0),通过
ord()和chr()完成转换
内容的提问来源于stack exchange,提问作者Andrew Garrison
相关产品推荐
相关产品推荐

