为什么fgets会在字符串末尾添加空格?

时间:2016-01-20 13:38:37

标签: php string compare fopen cat

我有一个包含单个字符串的文件。 我打开文件并读取值,使用fopen和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命令&#34; cat&#34;:

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

字符串末尾仍有空格。

我的目标是将文件中的字符串与我的代码中的值进行比较。

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

我总是得到&#34;不等于&#34;。 如何读取实际文件内容并将其存储到我的变量中?

3 个答案:

答案 0 :(得分:3)

要调试字符串,请尝试以下操作:

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获得的所有文本行的结尾,因为它标记了行的结尾(两个函数都返回) a&#34;&#34;来自各自活动的输出线。)

(注意:您可能会获得[0c] [0a]或CRLF,具体取决于您的系统。)

要修复,只需在处理它之前对字符串使用rtrim()

编辑:由于您在评论中添加了'hello '的案例,因此您可以使用更明确的内容,例如rtrim($mystring, "\r\n");

答案 1 :(得分:1)

)有很多事情可能是错的。我将从检查变量内容开始 - 如果可以调试,或者使用var_dump。

解决问题的一个好方法是使用file_get_contents()代替(http://php.net/manual/de/function.file-get-contents.php)。我认为这正是针对这类问题而制定的;)

答案 2 :(得分: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);