为何PHP正则表达式会匹配包含°的字符串‘station n°12015’?
问题原因及解决方案
你的正则之所以匹配了带°的字符串,核心原因是没启用UTF-8模式:
PHP的PCRE正则引擎默认按字节处理字符,而°和¬都是UTF-8编码的双字节字符(°对应0xC2 0xB0,¬对应0xC2 0xAC)。当正则不带u修饰符时,引擎会把¬拆成两个独立字节放进字符类,其中的0xC2字节刚好和°的第一个字节重合,所以被误判为匹配。
解决办法
给正则表达式加上u修饰符,强制引擎按完整Unicode字符处理,这样字符类里的每个符号都会被当作整体识别:
$special_characters_pattern = '/[£$%*}{~<>|=¬!?]/u';
另外可以简化正则里重复的>(原代码里的><>实际对应><>),改成<>不影响功能,更简洁。
修改后再测试station n°12015,就会输出OK,不会误判。
内容的提问来源于stack exchange,提问作者Andy McRae
相关产品推荐
相关产品推荐

