跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

PHP一段正则表达式匹配结果不一致的问题

我自定的函数如下,功能是匹配出特殊字符: 立即学习 “ PHP免费学习笔记(深入) ”;
function hasSpecialChar($subject) { $pattern = "/[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……&*()——+|{}【】‘;:”"“’。,、?]/"; if (preg_match($pattern, $subject)) { return true; } return false; }
我的结果:
var_dump(hasSpecialChar('问答社区')); // boolean true var_dump(hasSpecialChar('Segmentfault')); // boolean false var_dump(hasSpecialChar('@Segmentfault')); // boolean true
可以从第一个结果中看出是
'问答社区'
这个中文字符串被匹配出了特殊字符,但是我在Rubular上匹配
'问答社区'
则匹不出特殊字符,请问是不是我哪里写错了?还是preg_match函数的为题呢?一直找不到原因。 路过的大哥们帮帮忙,谢谢。 回复内容: 我自定的函数如下,功能是匹配出特殊字符: 立即学习 “ PHP免费学习笔记(深入) ”;
function hasSpecialChar($subject) { $pattern = "/[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……&*()——+|{}【】‘;:”"“’。,、?]/"; if (preg_match($pattern, $subject)) { return true; } return false; }
我的结果:
var_dump(hasSpecialChar('问答社区')); // boolean true var_dump(hasSpecialChar('Segmentfault')); // boolean false var_dump(hasSpecialChar('@Segmentfault')); // boolean true
可以从第一个结果中看出是
'问答社区'
这个中文字符串被匹配出了特殊字符,但是我在Rubular上匹配
'问答社区'
则匹不出特殊字符,请问是不是我哪里写错了?还是preg_match函数的为题呢?一直找不到原因。 路过的大哥们帮帮忙,谢谢。 但是我在Rubular上匹配'问答社区'则匹不出特殊字符 Rubular是基于Ruby的,Ruby 1.9以后对中文支持得很不错了。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 请问是不是我哪里写错了? 需要加上
u
修饰符,开启UTF-8支持
$pattern = "/[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……&*()——+|{}【】‘;:”"“’。,、?]/u";
一直找不到原因。 是PHP对中文支持不够好。 中文在PHP里是以16进制保存的,这就带来问题了。 比如,你的例子中,你匹配的那些特殊符号中包括中文的逗号,你告诉PHP的是,我要匹配一组特殊符号,其中包括中文的逗号,
[,]
,但是PHP不认识中文,它听到的是,你要匹配一组数据,其中包括
(中文逗号转换成十六进制),然后你传给它的“问答社区”,其中“区”字转换成十六进制就是
。你可以看到,这里
匹配上了,所以最后结果是
true
。 同理,你可以尝试找一下
字是因为和哪个特殊符号的十六进制匹配上了? php 汉字匹配可以考虑 mb_ 相应的函数,例如:mb_ereg(),虽然有些问题,但是大体上能比较省事的解决问题。 如果使用GBK字符集建议考虑转成UTF-8再处理。 PHP如果需要处理中文正则,请一定使用小写字母U 如把你的代码改成 这个即可
$pattern = "/[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……&*()——+|{}【】‘;:”"“’。,、?]/u";
不过我经常这样干
$pattern = "/[`~!@#$%^&*()+=|{}':;',\[\].<>/?~!@#¥%……&*()——+|{}【】‘;:”"“’。,、?]/isu";

相关文章