You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP匹配日文全角数字正则表达式返回所有全角字符问题

问题分析与解决方案

你的代码核心问题是正则表达式未添加u修饰符,PHP的preg系列函数默认按字节处理字符串,全角数字是Unicode多字节字符,不加u修饰符时,[0-9]的范围会被解析为字节范围,导致误匹配其他全角字符。

修正步骤与优化代码

  1. 修复正则表达式,添加u修饰符以支持Unicode字符匹配
  2. 无需拆分字符串再过滤,直接用preg_match_all一次性提取所有全角数字,提升效率
  3. 加入全角数字转半角的逻辑

修正后的完整代码:

// 匹配全角数字的正则,添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:55:46