Как различить пустую строку и endofline в PHP при чтении символ за символом. Короче говоря, я хочу знать, как найти пустую строку, читая char за char. Дайте мне знать, если что-то неясно с комментарием.
Спасибо…
Вы можете либо собрать символы текущей строки в буфер, а затем посчитать, когда увидите конец строки.
$buffer = '';
while (($char = fgetc($fp)) !== false) {
if ($char != '\n') {
$buffer .= $char;
} else {
if (strlen($buffer) == 0) {
echo "Empty line\n";
} else {
echo "Non-empty line\n";
}
$buffer = '';
}
}
Или вы сохраняете количество символов во время чтения, пока не увидите конец строки
$count = 0;
while (($char = fgetc($fp)) !== false) {
if ($char != '\n') {
++$count;
} else {
if ($count == 0) {
echo "Empty line\n";
} else {
echo "Non-empty line\n";
}
$count = 0;
}
}
Как видите, обе версии схожи, это зависит только от того, нужна ли вам линия впоследствии или нет.
Учитывать \r
, вы можете компенсировать, когда вы видите один непосредственно перед \n
например,
$cr = false;
$count = 0;
while (($char = fgetc($fp)) !== false) {
if ($char != '\n') {
$cr = false;
++$count;
if ($char == "\r")
$cr = true;
} else {
if ($cr)
--$count;
if ($count == 0) {
echo "Empty line\n";
} else {
echo "Non-empty line\n";
}
$count = 0;
}
}
$cr
верно, если предыдущий символ был \r
, Так что, если вы посмотрите на новую строку и $cr
верно, у вас есть CRLF
и уменьшить количество символов на единицу.
В качестве альтернативы, вы можете собрать всю строку и обрезать пробелы, прежде чем смотреть на длину
if (strlen(trim($buffer)) == 0) {
echo "Empty line\n";
} else {
echo "Non-empty line\n";
}
Даже если не спрашивать, чтение всей строки и проверка могут быть более эффективными, например,
while (($buffer = fgets($fp)) !== false) {
if (strlen(rtrim($buffer, "\n")) == 0) {
echo "Empty line\n";
} else {
echo "Non-empty line\n";
}
}
Других решений пока нет …