PHP正则如何同时匹配数字、字母、汉字 过滤其余无效字符
问题解答
原写法不生效的原因
你编写的正则表达式逻辑存在错误:
\P{Han}的作用是匹配所有非汉字字符,[0-9a-zA-Z]的作用是匹配所有大小写英文字母和数字- 你使用
|或逻辑连接两个匹配规则,代表只要符合「非汉字」或「是数字字母」的字符都会被替换为空 - 由于数字、字母本身就属于「非汉字」的范畴,该正则最终会删除除汉字外的所有内容,因此无法得到预期结果。
正确的合并写法
你需要保留的是数字、字母、汉字三类字符,因此只需要匹配「不属于这三类的所有字符」替换为空即可,正确代码如下:
preg_replace('/[^0-9a-zA-Z\p{Han}]/u', '', $raw);
规则说明
[^xxx]是反向字符集,匹配所有不在xxx范围内的字符\p{Han}用于匹配所有汉字,必须搭配u修饰符才能正常识别Unicode编码的汉字- 整体逻辑为删除所有非数字、非大小写字母、非汉字的字符,完全匹配你的需求。
效果验证
针对你给出的示例输入:
原始字符串:
a>b%%c##1@23测$$试??\\:.##,,??!!
处理后输出结果为:abc123测试,与预期结果一致。
内容的提问来源于stack exchange,提问作者DengSihan
相关产品推荐
相关产品推荐

