PHP удаляет CR при чтении текстового файла?

Определенный текстовый файл содержит только разрывы строк 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

Решение

Попробуйте это решение:

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

PHP_EOL как символ новой строки в кросс-платформенном виде, поэтому он обрабатывает Windows / Mac / Unix.

Также проверьте документация для этой константы.

0

Другие решения

Да вот что Еореп делает в зависимости от параметров, которые вы задаете, и вы можете найти это в документации: http://php.net/manual/en/function.fopen.php

Windows предлагает флаг перевода в текстовом режиме (‘t’), который
прозрачно перевести \ n в \ r \ n при работе с файлом. В
напротив, вы также можете использовать «b» для принудительного запуска двоичного режима, который не будет
переведите ваши данные. Чтобы использовать эти флаги, укажите «b» или «t» как
последний символ параметра режима.

то есть вы можете избежать такого «перевода», используя флаг «b» в Режим параметр. Например:

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