2016-01-20 5 views
0

У меня есть файл, который содержит одну строку. Открываю файл и читаю значение, с fopen и fgets, я заметил, что в конце строки добавлено пространство.Почему fgets добавляет пробел в конце строки?

$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>"); 
$mystring= fgets($file); 
fclose($file); 

Содержание MYFILE:

Hello 

Тест

echo "<p>'".$mystring."'</p>"; //Output: 'Hello ' 

Как вы можете видеть, что теперь пространство в конце строки, даже если нет места в файл.

Я попробовал то же самое с Linux командой «кошки»:

$mystring = shell_exec("cat myfile"); 
echo "<p>'".$mystring."'</p>"; //Output: 'Hello ' 

Еще пространство в конце строки.

Моя цель - сравнить строку в файле со значением в моем коде.

if ($mystring === "Hello") 
{ 
    echo "Equal"; 
} 
else 
{ 
    echo "not equal"; 
} 

Я всегда получаю «не равный». Как я могу прочитать и сохранить фактическое содержимое файла в моей переменной?

+0

Вы можете использовать '' trim() '] (http://php.net/manual/en/function.trim.php). У фактического содержимого файла есть новая строка? Был ли файл создан с помощью редактора, который не поддерживает текст? Существует много причин, по которым пространство может быть там. –

+0

Нет, потому что тогда, если содержимое файла «hello» («hello» с пробелом в конце), я теряю пространство в конце. Мне нужен фактический контент. Файл был создан с помощью «nano», я также попробовал gedit. – Black

ответ

3

Для отладки строки, попробуйте следующее:

foreach(str_split($mystring) as $chr) { 
    printf("[%02x] %s <br />",ord($chr),$chr); 
} 

Это должно, в вашем случае, выход что-то вроде ...

[48] H
[65] е
[6c] л
[6c] л
[6f] о
[0a]

Обратите внимание на это последнее. 0x0a - символ новой строки, в результате чего все строки текста, полученные через fgets и shell_exec, заканчиваются, так как это то, что знаменует конец строки (обе функции возвращают «линию» вывода из их соответствующей активности).

. (Примечание: Вы можете получить [0c] [0a], или CRLF, в зависимости от вашей системы)

Чтобы исправить, просто использовать rtrim() на строку перед обработкой его.

EDIT: Так как вы добавили в комментариях, что случай 'hello ' должен быть разрешен, то вы можете использовать что-то более конкретное, как rtrim($mystring, "\r\n");

+0

Спасибо за этот полезный ответ! Он работает сейчас, как и ожидалось. – Black

1

) Там довольно много вещей, которые могли бы быть неправильно. Я бы начал с проверки содержимого переменной - отладка, если вы можете, или используйте var_dump.

Хорошим способом решить эту проблему было бы использование file_get_contents() вместо этого (http://php.net/manual/de/function.file-get-contents.php). Я думаю, что это точно сделано для таких проблем;)

+0

Спасибо за ваш ответ. Но, к несчастью, я все равно получаю «не равный» – Black

+1

Хорошо. поэтому проблема заключается не в открытии и чтении содержимого файла. Я думаю, что у «Niet» есть проблема в корне, ваш файл содержит, вероятно, больше, чем только 5 символов «Hello». Может быть, новая линия? – Salic

1

Это может быть случай различий в контурах строк, таких как MsDos, Unix или Mac.Вы можете использовать функцию auto_detect_line_endings. (Больше информации here).

Или вы можете просто обрезать текст из выходного файла перед сравнением, как показано ниже.

$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>"); 
$mystring= fgets($file); 
$mystring= trim($mystring); 
fclose($file); 
+0

Благодарим вас за ответ. Но тогда, если содержимое файла будет «Hello» (Hello с пробелом в конце), то я бы изменил исходное значение, но я не хочу изменять значение. Я просто не хочу получать фактическое значение и хранить его в переменной. – Black

+0

Итак, если у вас есть привет, без конечного пространства, то fgets должен получить EOF или следующий символ строки. Который будет выясняться с помощью функции/директивы auto_detect_line_endings, о которой я упоминал в своем ответе. Тогда, возможно, вам не придется использовать обрезку и изменить исходный текст. –

Смежные вопросы