使用PHP制作打印

使用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

我的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_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];