以下是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中成功显示为备用行。)
有谁知道为什么它无法识别这些换行符?
答案 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})
答案 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不使用转义字符,除非它们是双引号。