2016-01-20 113 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]升
[1207] O
[0A]

记下最后一个。 0x0a是一个换行符,它是通过fgetsshell_exec获得的所有文本行的结尾,因为这标志着行的末尾(这两个函数都会从其各自的活动返回一行“输出”)。

(注意:您可能会[0c] [0a],或CRLF,取决于你的系统)

要解决,只是处理它之前的字符串中使用rtrim()

编辑:既然你的评价是的'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”从根本上存在问题,您的文件可能包含的不仅仅是“Hello”的5个字符。一条新线可能? – 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),那么我会改变原来的值,但我不想改变它的值。我只想得到实际的值并将其存储在一个变量中。 – Black

+0

所以如果你有一个没有尾随空间的问候,那么fgets应该得到一个EOF或下一行字符。它会使用我在我的答案中提到的auto_detect_line_endings函数/指令来计算出来。 然后,也许你不必使用修剪和改变原来的文字。 –

相关问题