使用PHP preg_split按换行分割文本,可使用\R。

3
据我理解,以下代码应该会将字符串按照换行符(\r\n\r\n)进行分割。
preg_split("%\R%", $str);

为什么会这样?
var_dump(preg_split("%\R%", "Å"));

输出

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

但是。
var_dump(preg_split("%(\r|\n|\r\n)%", "Å"));

正常情况下不应该拆分字符,我知道应该使用“u”修饰符(PCRE_UTF8),因为字符是UTF-8编码的,但为什么preg_split认为Å(0xC3 0x85)可能包含换行符?


1
正如@anubhava的答案所解释的那样,尽管在PHP文档中提到了\x85字符,但PCRE库将其识别为换行序列 - axiac
1个回答

5

你还提到了 Å0xC3 0x85

根据 这份 PCRE 文档,如果不使用 u 修饰符,\R 相当于这个原子组:

(?>\r\n|\n|\r|\f|\x0b|\x85)

请注意两个集合中都有\x85

因此,如果在没有使用u修饰符的情况下在\R上拆分,则输出数组中将多出一个元素,因为它能够在\x85上拆分,只给出\xC3和结果数组中的一个空结果。


你能提供\R的定义参考吗?PHP文档关于PCRE的转义序列页面只是说:“匹配\n\r\r\n”。 - axiac
PHP文档实际上是不完整的。请查看官方PCRE文档,并查看标题为“Newline sequences”的部分。 - anubhava
1
找到了一个可链接的参考版本:http://www.pcre.org/current/doc/html/pcre2pattern.html#newlineseq。这是很好的知识。 - axiac
1
谢谢,这样好多了。我也会在答案中添加这个链接。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接