为什么 echo() 输出的 base64_decode() 不能在浏览器中完全显示出来


why base64_decode() output by echo() can not show itself completely in browser?

请参阅下面的代码:

<?php
$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpbnRlciI7DQoNCiRzdHIg
PSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+
IjsNCg0KZXZhbCgiXCRzdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
echo base64_decode($str);
?>

这是一个简单的PHP代码,您可以使用下面的URL解码base64字符串:
http://www.base64decode.org/

为什么这个例子中的base64_decode()函数不能做它的工作。输出如下所示:

"; eval("'$str = '"$str'";"); echo $str; ?>  

而不是:

<?php
$string = "beautiful";
$time = "winter";
$str = 'This is a $string $time morning!';
echo $str. "<br />";
eval("'$str = '"$str'";");
echo $str;
?> 

问题是什么,如何解决大代码?

编辑:
输出有一个不可见的部分,我可以通过页面源找到它。
但为什么会有这种反应呢?
提前致谢

问题是您将其视为 HTML。如果您查看源代码或传递标头以使浏览器将其解释为文本,您将看到整个内容。

试试这个,它可能会帮助你。

$bodyData = strtr($str, array('-' => '+', '_' => '/'));
$messagesDetail['body'] = base64_decode($bodyData);

eval 语句只是执行命令并返回字符串。而你真正需要的是评估内部的评估,这有点荒谬。发生...

尝试查看输出的来源 - 我很确定完整的内容在那里,但您的浏览器试图将其读取为 HTML。

回显 base64 编码的 PHP 脚本不会神奇地评估它;你必须自己做:

eval(base64_decode($str));

你添加了那些换行符吗?

如果您像这样使用代码:

<?php
$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpbnRlciI7DQoNCiRzdHIgPSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+IjsNCg0KZXZhbCgiXCRzdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
echo base64_decode($str);
?>

它工作得很好。

但是您在字符串中添加了换行符 ("'") 字符。为了在多条线路上制动它。这就是为什么它不起作用的原因。

如果您需要在多条线路上制动它,则必须这样做:

<?php
$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpbnRlciI7DQoNCiRzdHIg'.
       'PSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+'.
       'IjsNCg0KZXZhbCgiXCRzdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
echo base64_decode($str);
?>

如果要将这些换行符保留在字符串中,例如,如果您有一个已经自动换行的大 base64 编码字符串(通常为每行 70-80 个字符),您可以执行以下操作:

$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpb
        nRlciI7DQoNCiRzdHIgPSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW
        9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+IjsNCg0KZXZhbCgiXCR
        zdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
$str = implode('', preg_split('/'s*/', $str));
echo base64_decode($str);