检测换行符

时间:2012-01-05 16:17:14

标签: php

以下是myfunction的一部分,它打开一个文件并将指针放在末尾。然后它以相反的顺序测试每个字符$char,直到找到换行符或回车符。

问题是它没有识别这些字符。

功能如下:

while(count($results) < $limit && fseek($this->_pointer, $offset, SEEK_END) >= 0) {
    $char = fgetc($this->_pointer);
    if($char == '\n' || $char == '\r'){
        print("YAY");
        $offset --;
        $data = $this->explodeData(fgets($this->_pointer, 1024));
        array_push($results, $this->formatRow($data));
    }
    $offset--;
}

它永远无法管理print("YAY"),但它成功测试了每个角色。它正在读取的文件肯定有新行。 (该文件是由另一个函数创建的,其中插入了"\n",它显示在其中,并在我的IDE中成功显示为备用行。)

有谁知道为什么它无法识别这些换行符?

3 个答案:

答案 0 :(得分:16)

为了使您的代码平台不可知,最好是这样的if条件:

if($char == PHP_EOL) {
   print("YAY");
   // your rest of the code
}

感谢@FélixGagnon-Grenier的评论。

PHP_EOL可能不适用于来自其他系统的字符串。 PHP_EOL表示当前系统的结束字符。

要使其检测所有类型的换行符,包括unicode换行符,请使用\R

preg_match('/\R/', $str);

\R相当于(?>\r\n|\n|\r|\f|\x0b|\x85|\x{2028}|\x{2029})

Code Demo

答案 1 :(得分:10)

您使用'\n'代替"\n"

while(count($results) < $limit && fseek($this->_pointer, $offset, SEEK_END) >= 0) {
    $char = fgetc($this->_pointer);
    if($char == "\n" || $char == "\r"){
        print("YAY");
        $offset --;
        $data = $this->explodeData(fgets($this->_pointer, 1024));
        array_push($results, $this->formatRow($data));
    }
    $offset--;
}

"\n" == LF character
'\n' == '\n';

// Variables are effected also
$var = 'foo';

print "$var"; // prints 'foo';
print '$var'; // prints '$var';

答案 2 :(得分:3)

在“\ n”和“\ r”

周围使用双引号而不是单引号

我有一个类似的噩梦,直到​​我意识到php不使用转义字符,除非它们是双引号。