为什么 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 是一个换行符,这是通过 fgetsshell_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);