使用PHP制作打印
我的PHP EOL是“\r\n”,但是,当我在数组上打印时,每一行后面都有一个“\n”-而不是一个“\r\n”-使用PHP制作打印,php,eol,Php,Eol,我的PHP EOL是“\r\n”,但是,当我在数组上打印时,每一行后面都有一个“\n”-而不是一个“\r\n”- 是否有可能改变这种行为?这可能不是最优雅的解决方案,但您可以使用缓冲区输出捕获print\u r()输出,然后使用str\u replace()将\n的存在替换为PHP\u EOL。在本例中,我将其替换为x,以显示它正在工作 ob_start(); $test_array = range('A', 'Z'); print_r($test_array); $dump = ob_ge
是否有可能改变这种行为?这可能不是最优雅的解决方案,但您可以使用缓冲区输出捕获
print\u r()
输出,然后使用str\u replace()
将\n
的存在替换为PHP\u EOL
。在本例中,我将其替换为x
,以显示它正在工作
ob_start();
$test_array = range('A', 'Z');
print_r($test_array);
$dump = ob_get_contents();
ob_end_clean();
正如dognose所指出的,由于PHP4.3,您可以将print\r()
的结果返回到字符串中(更优雅):
然后替换线条端点:
$dump = str_replace("\n", "x" . PHP_EOL, $dump);
echo $dump;
输出:
Arrayx
(x
[0] => Ax
[1] => Bx
[2] => Cx
[3] => Dx
[4] => Ex
[5] => Fx
[6] => Gx
... etc
[25] => Zx
)x
使用
print\r
中的第二个参数(设置true
),读取文档:
见:
混合打印(混合$expression[,bool$return=false])
例如:
$eol = chr(10); //Break line in like unix
$weol = chr(13) . $eol; //Break line with "carriage return" (required by some text editors)
$data = print_r(array(...), true);
$data = str_replace(eol, weol, $data);
echo $data;
如果您查看
print\r
的源代码,您会发现:
PHP_FUNCTION(print_r)
{
zval *var;
zend_bool do_return = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &var, &do_return) == FAILURE) {
RETURN_FALSE;
}
if (do_return) {
php_output_start_default(TSRMLS_C);
}
zend_print_zval_r(var, 0 TSRMLS_CC);
if (do_return) {
php_output_get_contents(return_value TSRMLS_CC);
php_output_discard(TSRMLS_C);
} else {
RETURN_TRUE;
}
}
ZEND_API void zend_print_zval_r(zval *expr, int indent TSRMLS_DC) /* {{{ */
{
zend_print_zval_r_ex(zend_write, expr, indent TSRMLS_CC);
}
最终,您可以忽略zend_print_zval_r(var,0 TSRMLS_CC)周围的内容代码>用于回答您的问题
如果您遵循stacktrace,您将发现:
PHP_FUNCTION(print_r)
{
zval *var;
zend_bool do_return = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &var, &do_return) == FAILURE) {
RETURN_FALSE;
}
if (do_return) {
php_output_start_default(TSRMLS_C);
}
zend_print_zval_r(var, 0 TSRMLS_CC);
if (do_return) {
php_output_get_contents(return_value TSRMLS_CC);
php_output_discard(TSRMLS_C);
} else {
RETURN_TRUE;
}
}
ZEND_API void zend_print_zval_r(zval *expr, int indent TSRMLS_DC) /* {{{ */
{
zend_print_zval_r_ex(zend_write, expr, indent TSRMLS_CC);
}
这导致了
ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int indent TSRMLS_DC) /* {{{ */
{
switch (Z_TYPE_P(expr)) {
case IS_ARRAY:
ZEND_PUTS_EX("Array\n");
if (++Z_ARRVAL_P(expr)->nApplyCount>1) {
ZEND_PUTS_EX(" *RECURSION*");
Z_ARRVAL_P(expr)->nApplyCount--;
return;
}
print_hash(write_func, Z_ARRVAL_P(expr), indent, 0 TSRMLS_CC);
Z_ARRVAL_P(expr)->nApplyCount--;
break;
从这一点开始,您可以继续找到相关的行-但是由于已经有一个硬编码的“Array\n”
-我将假定打印\r
实现的其余部分使用相同的硬编码\n
换行符
因此,要回答您的问题:您不能将其更改为使用\r\n
。
使用提供的解决方法之一
Sidenode:由于print\r
主要用于调试,因此这也可以完成以下工作:
echo "<pre>";
print_r($object);
echo "</pre>";
echo”“;
打印(对象);
回声“;
正如本页其他地方指出的,换行符是在PHP源代码中硬编码的,因此您必须手动替换它们
您可以使用自己版本的print\r
如下:
// aliasing a function (PHP 5.6+)
use My\print_r as print_r;
print_r("A string with \r\n is not replaced");
print_r("A string with \n is replaced");
然后将使用PHP\u EOL
换行。请注意,它将仅替换换行符,例如\n
,而不是$expression
中可能包含的任何\r\n
。这是为了防止任何\r\n
变为\r\r\n
这样做的好处是,它可以作为本机函数的替代品。因此,只要添加use语句,就可以替换任何已经使用本机打印的代码。标记的问题与此问题重复。我想回答更多关于如何改变打印行为的问题。我的建议是用另一个名字做另一个函数来定制打印。我们只需要用print\r\u pretty替换print\r函数
$out = str_replace("\n", "\r\n", $out);
但是行:
$out = explode("\n", $out, 2)[1];
可以替换为另一行,对打印进行其他更改,如下所示:
事实上,这并不优雅。您可以使用$val=print\r($something,true)
因为PHP4.3\r\n
是针对windows的,linuxI上的\n
将Guilherme Nascimento的回答标记为答案,因为它提供了一种解决方法,但实际上我更喜欢你的答案。我欣赏并尊重你的彻底性!Inchpinching:实际上您的措辞不正确-\n
是windows和unix的新词。Windows只需要额外的\r
(回车)
$out = explode("\n", $out, 2)[1];