为什么 fgets 在字符串末尾添加 space?
Why does fgets adds a space at the end of string?
我有一个包含单个字符串的文件。
我打开文件并使用 fopen 和 fgets 读取值,我注意到在字符串末尾添加了 space。
$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 '
如您所见,字符串末尾现在有一个 space,即使文件中没有 space。
我用 linux 命令尝试了同样的方法 "cat":
$mystring = shell_exec("cat myfile");
echo "<p>'".$mystring."'</p>"; //Output: 'Hello '
字符串末尾仍然是一个space。
我的目标是将文件中的字符串与我的代码中的值进行比较。
if ($mystring === "Hello")
{
echo "Equal";
}
else
{
echo "not equal";
}
我总是 "not equal"。
我如何读取实际文件内容并将其存储到我的变量中?
要调试字符串,试试这个:
foreach(str_split($mystring) as $chr) {
printf("[%02x] %s <br />",ord($chr),$chr);
}
在您的情况下,这应该会产生类似于...
[48] H
[65] e
[6c] l
[6c] l
[6f] o
[0a]
注意最后一个。 0x0a
是一个换行符,这是通过 fgets
和 shell_exec
获得的所有文本行的结尾,因为这是行尾的标记(两个函数 return "line" 来自它们各自 activity) 的输出。
(注意:您可能会得到 [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。 (更多信息 here)。
或者您可以简单地 trim 比较之前输出文件中的文本,如下所示。
$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>");
$mystring= fgets($file);
$mystring= trim($mystring);
fclose($file);
我有一个包含单个字符串的文件。 我打开文件并使用 fopen 和 fgets 读取值,我注意到在字符串末尾添加了 space。
$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 '
如您所见,字符串末尾现在有一个 space,即使文件中没有 space。
我用 linux 命令尝试了同样的方法 "cat":
$mystring = shell_exec("cat myfile");
echo "<p>'".$mystring."'</p>"; //Output: 'Hello '
字符串末尾仍然是一个space。
我的目标是将文件中的字符串与我的代码中的值进行比较。
if ($mystring === "Hello")
{
echo "Equal";
}
else
{
echo "not equal";
}
我总是 "not equal"。 我如何读取实际文件内容并将其存储到我的变量中?
要调试字符串,试试这个:
foreach(str_split($mystring) as $chr) {
printf("[%02x] %s <br />",ord($chr),$chr);
}
在您的情况下,这应该会产生类似于...
[48] H
[65] e
[6c] l
[6c] l
[6f] o
[0a]
注意最后一个。 0x0a
是一个换行符,这是通过 fgets
和 shell_exec
获得的所有文本行的结尾,因为这是行尾的标记(两个函数 return "line" 来自它们各自 activity) 的输出。
(注意:您可能会得到 [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。 (更多信息 here)。
或者您可以简单地 trim 比较之前输出文件中的文本,如下所示。
$file = fopen("myfile", "r") or exit("<br><p>Unable to open file</p><br>");
$mystring= fgets($file);
$mystring= trim($mystring);
fclose($file);