PHP在阅读文本文件时是否删除了CR?

时间:2015-05-13 14:27:43

标签: php text text-processing carriage-return file-read

某个txt文件仅包含CRLF换行符。已通过在Notepad ++中打开文件并启用“显示所有字符”来确认。

使用PHP读取文件时,使用file_get_contents()或fopen(),CR字符似乎被过滤掉了:

<?php
    ...
    $fh = fopen($path, 'r');

    while (!feof($fh)) {
        $string .= fread($fh, 1024);
    }

    preg_match_all('/\r/', $string, $matches);
    var_dump($matches);

    // 0 matches: array(1) { [0]=> array(0) { } }

    $string2 = file_get_contents($path);
    preg_match_all('/\r/', $string2, $matches2);
    var_dump($matches2);

    // 0 matches: array(1) { [0]=> array(0) { } }
?>

我很困惑,因为每个提到的函数的文档都没有说明这一点。也许有其他方法可以准确地打开文件。

需要确认这些函数是否过滤掉或“标准化”CR字符。是这样,这些功能还可以“正常化”吗?有没有办法避免这种行为?

为了更明确,我需要这些CR字符,并且在将文件加载到变量中时,每个位都保持不变。

谢谢

2 个答案:

答案 0 :(得分:0)

试试这个解决方案:

preg_match_all('/'.PHP_EOL.'/', $string, $matches);

PHP_EOL 是跨平台方式的换行符,因此它处理Windows / Mac / Unix。

同时检查documentation此常量。

答案 1 :(得分:0)

是的, fopen 的功能取决于您提供的参数,您可以在文档中找到它:http://php.net/manual/en/function.fopen.php

  

Windows提供了一个文本模式转换标志('t')   在处理文件时透明地将\ n转换为\ r \ n。在   相比之下,您也可以使用'b'来强制二进制模式,而不是   翻译您的数据。要使用这些标志,请指定“b”或“t”   模式参数的最后一个字符。

即。你可以通过在模式参数中使用'b'标志来避免这种“翻译”。例如:

fopen($path, 'rb'); // Read in binary mode