PHP preg_被新行拆分为\R\n

PHP preg_被新行拆分为\R\n,php,regex,pcre,Php,Regex,Pcre,据我所知,以下代码行应在新行(\r、\n和\r\n)处拆分字符串 为什么会这样 var_dump(preg_split("%\R%", "Å")); 输出 array(2) { [0]=> string(1) "▒" [1]=> string(0) "" } 但是 是否按预期工作且不拆分角色?我知道我应该使用“u”修饰符(PCRE_UTF8),因为字符是UTF-8,但是为什么preg_split认为Å(0xC3 0x85)可以包含新行?您还提到Å是0xC3 0x8

据我所知,以下代码行应在新行(
\r
\n
\r\n
)处拆分字符串

为什么会这样

var_dump(preg_split("%\R%", "Å"));
输出

array(2) {
  [0]=>
  string(1) "▒"
  [1]=>
  string(0) ""
}
但是


是否按预期工作且不拆分角色?我知道我应该使用“u”修饰符(PCRE_UTF8),因为字符是UTF-8,但是为什么
preg_split
认为Å(
0xC3 0x85
)可以包含新行?

您还提到
Å
0xC3 0x85

根据,不使用
u
修饰符
\R
相当于此原子群:

(?>\r\n|\n|\r|\f|\x0b|\x85)
注意两组中都存在
\x85


因此,在
\R
上拆分而不使用
u
修饰符会在输出数组中提供一个额外的元素,因为它能够在
\x85
上拆分,只给您
\xC3
和一个空的结果作为结果数组。

您能提供
\R
定义的参考吗?关于PCRE的PHP文档页面只说:“匹配
\n
\r
\r\n
”。PHP文档实际上是不完整的。和新行序列标题下的节。找到引用的可链接版本:。很高兴知道。谢谢,那好多了。我也添加了这个链接来回答问题。正如@anubhava的解释,尽管在中提到了,
\x85
字符被PCRE库识别为a。
var_dump(preg_split("%(\r|\n|\r\n)%", "Å"));
(?>\r\n|\n|\r|\f|\x0b|\x85)