У меня есть файл, который содержит одну строку.
Я открываю файл и читаю значение с помощью fopen и fgets, я заметил, что в конце строки добавляется пробел.
$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>");
$mystring= fgets($file);
fclose($file);
Содержание моего файла:
Hello
Тестовое задание
echo "<p>'".$mystring."'</p>"; //Output: 'Hello '
Как вы можете видеть, в конце строки теперь есть пробел, хотя в файле нет места.
Я попробовал то же самое с командой linux «cat»:
$mystring = shell_exec("cat myfile");
echo "<p>'".$mystring."'</p>"; //Output: 'Hello '
Еще пробел в конце строки.
Моя цель — сравнить строку в файле со значением в моем коде.
if ($mystring === "Hello")
{
echo "Equal";
}
else
{
echo "not equal";
}
Я всегда получаю «не равны».
Как я могу прочитать и сохранить фактическое содержимое файла в моей переменной?
Чтобы отладить строку, попробуйте это:
foreach(str_split($mystring) as $chr) {
printf("[%02x] %s <br />",ord($chr),$chr);
}
Это должно, в вашем случае, дать что-то вроде …
[48] H
[65] е
[6c] л
[6c] л
[6f] o
[0a]
Обратите внимание на этот последний. 0x0a
является символом новой строки, который является то, что все строки текста, полученные через fgets
а также shell_exec
end with, так как именно это обозначает конец строки (обе функции возвращают «строку» вывода из их соответствующего действия).
(Примечание: вы можете получить [0c] [0a]
или CRLF, в зависимости от вашей системы.)
Чтобы исправить, просто используйте rtrim()
на строку перед обработкой.
РЕДАКТИРОВАТЬ: так как вы добавили в комментарии, что случай 'hello '
должно быть разрешено, тогда вы можете использовать что-то более явное, например, rtrim($mystring, "\r\n");
) Есть много вещей, которые могут быть не правы. Я бы начал с проверки содержимого переменных — отладки, если можете, или использования var_dump.
Хороший способ обойти проблему — использовать вместо нее file_get_contents () (http://php.net/manual/de/function.file-get-contents.php). Я думаю, что именно для такого рода проблем;)
Это может быть причиной различий в конце строк, таких как MsDos, Unix или Mac. Вы можете использовать функцию auto_detect_line_endings. (Больше информации Вот).
Или вы можете просто обрезать текст из выходного файла перед сравнением, как показано ниже.
$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>");
$mystring= fgets($file);
$mystring= trim($mystring);
fclose($file);