Я сделал так:
protected function getFields(string $filePath): \Generator
{
$file = new SplFileObject($filePath);
$line = '';
foreach ($file as $buffer) {
if (substr($buffer, -2) == "\\\n") {
$line .= substr($buffer, 0, -2) . "\n";
continue;
}
yield $line;
}
}
НО: это не учитывает случай, когда сам символ экранирования экранируется. Например, дан такой файл для чтения:
qwerty\\
asdfgh
Ожидание:
[
"qwerty\\",
"asdfgh",
]
Реальность:
[
"qwerty\
asdfgh",
]
Как решить проблему?
Никаких идей, кроме посимвольного чтения файла у меня пока нет. Но это, подозреваю, будет очень медленно. Тогда лучше читать файл кусками через fread, затем в оперативной памяти его посимвольно читать, и, после найденного неэкранированного символа перевода, отбрасывать "лишнее".