我正在尝试处理包含字母、数字、中文和一些标点符号的字符串,只留下数字、字母和中文,如下所示
原始字符串
a>b%%c##1@23测$$试??\\:.##,,??!!
结果
abc123测试
对于中文,preg_replace('/\P{Han}+/u', '', $text)
完美工作
测试 // result
对于数字和字母,preg_replace('/[^0-9a-zA-Z]/', '', $text)
也有效。
abc123 // result
但是我怎样才能将它们结合起来呢?
为什么 preg_replace('/[\P{Han}]|[0-9a-zA-Z]/u', '', $raw);
不能按预期工作?
非常感谢大家的帮助!
最佳答案
你需要
preg_replace('~[^0-9a-zA-Z\p{Han}]+~u', '', $raw)
请参阅regex demo .
[^0-9a-zA-Z\p{Han}]+
是一个否定字符类,匹配除 ASCII 数字、ASCII 字母和任何中文字符之外的任何一个或多个字符.
在此模式中使用 u
标志非常重要,因为您的输入是 Unicode 字符串。
请参阅PHP demo :
$raw = 'a>b%%c##1@23测$$试??\\:.##,,??!!';
echo preg_replace('~[^0-9a-zA-Z\p{Han}]+~u', '', $raw);
// => abc123测试
关于php 正则表达式 : how to match number + letters + Chinese,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68907713/