PHP正则匹配阿拉伯字符串时\R误判换行符,str_contains未检测到\r
问题分析与解答
这和非ASCII字符串本身无关,问题出在正则表达式中\R的匹配规则上:
- PHP的PCRE正则引擎里,
\R是一个特殊转义序列,它匹配的是所有Unicode标准定义的换行类字符/序列,包括:- 普通的
\r(U+000D)、\n(U+000A)、\r\n组合 - 非ASCII的换行相关字符:U+0085(下一行)、U+2028(行分隔符)、U+2029(段落分隔符)等
- 普通的
- 而
str_contains($foo, "\r")只会精确匹配ASCII的回车符(U+000D),不会识别其他Unicode换行类字符。
你的测试字符串中,肉眼看不到的换行符大概率是某个非ASCII的Unicode换行类字符(比如U+2028或U+2029),所以会被\R匹配到,但不会被str_contains的精确匹配命中。
如果要验证,可以用bin2hex($foo)查看字符串的十六进制编码,就能找到那个隐藏的换行类字符;或者把正则改成只匹配ASCII回车符/\r/,此时preg_match会和str_contains返回一致的结果。
内容的提问来源于stack exchange,提问作者callum
相关产品推荐
相关产品推荐

