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

使用[:alnum:]正则仅保留[a-f0-9]字符时无法过滤非罗马字符问题

问题原因

你当前的实现存在两处不符合需求的逻辑:

  • POSIX 字符类 [:alnum:] 在开启 u(Unicode)修饰符时,会匹配所有 Unicode 标准下的字母与数字,不仅限于 ASCII 范围内的字符。日文汉字属于 Unicode 字母分类,因此会被当做合法字符保留,不会被过滤。
  • 你的需求是仅保留 [a-f0-9] 范围内的字符,但 [:alnum:] 会匹配所有大小写英文字母,本身就超出了你需要的字符范围。你给出的测试用例 hello?world 处理后得到 helloworld 其实也不符合原始要求,因为 h、l、o、w、r、d 都不在 a-f 的范围内。
修复方案

直接在正则中明确指定需要保留的字符范围即可:

// 仅保留小写a-f、0-9
$text = preg_replace("/[^a-f0-9]/", '', $text);

如果需要兼容 Unicode 输入场景,可保留 u 修饰符:

$text = preg_replace("/[^a-f0-9]/u", '', $text);

如果需要同时匹配大写A-F,可添加 i 修饰符忽略大小写:

// 支持大小写A-F、0-9
$text = preg_replace("/[^a-f0-9]/ui", '', $text);
效果验证
  • 输入 hello?world 处理后结果为 ed(仅匹配原字符串中符合a-f范围的e、d)
  • 输入 日本国 处理后结果为空字符串
  • 输入 A1b3?z9 加i修饰符处理后结果为 A1b39

内容的提问来源于stack exchange,提问作者Henrik Petterson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:05