我的PHP_EOL是「\ r \ n」,但是當我在數組上執行print_r
時,每行都有一個「\ n」 - 而不是「\ r \ n」 - 放在它後面。製作print_r使用PHP_EOL
任何想法是否有可能改變這種行爲?
我的PHP_EOL是「\ r \ n」,但是當我在數組上執行print_r
時,每行都有一個「\ n」 - 而不是「\ r \ n」 - 放在它後面。製作print_r使用PHP_EOL
任何想法是否有可能改變這種行爲?
使用在print_r
(設定true
),讀DOC第二PARAM: http://www.php.net/manual/en/function.print-r.php
參見: mixed print_r (mixed $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;
Inchpinching:實際上你的措辭不正確 - '\ n'是windows AND unix的換行符。 Windows只需要額外的'\ r'(回車) – dognose
@dognose謝謝! –
這可能不是最完美的解決方案,但你可以捕捉到print_r()
輸出使用緩衝輸出,然後用str_replace()
與PHP_EOL
取代的\n
存在性。在這個例子中,我與x
取代它,以表明它的工作...
ob_start();
$test_array = range('A', 'Z');
print_r($test_array);
$dump = ob_get_contents();
ob_end_clean();
正如dognose指出,自PHP 4.3你可以返回的print_r()
結果轉換成字符串(更優雅):
$dump = print_r($test_array, true);
然後替換行結尾:
$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
,實際上這並不優雅。你可以使用'$ val = print_r($ something,true);'因爲php 4.3 – dognose
@dognose不錯的一個 –
如果你看的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_print_zval_r(var, 0 TSRMLS_CC);
你的問題。
如果按照堆棧跟蹤,你會發現:
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"
- 我會假設print_r
實現的其餘部分使用相同的硬編碼\n
換行符。
所以,要回答你的問題:你不能改變它使用\r\n
。 使用提供的解決方法之一。
Sidenode:由於print_r
主要用於調試,這將做的工作還有:
echo "<pre>";
print_r($object);
echo "</pre>";
我標記了Guilherme Nascimento的回答,因爲它提供了一種解決方法,但我更喜歡你的答案。我欣賞並尊重你的徹底! – neubert
如同指出別處此頁面上,新行被硬編碼在PHP源代碼,所以你必須手動替換它們。
你可以使用自己的print_r
版本是這樣的:
namespace My;
function print_r($expression, $return = false)
{
$out = \print_r($expression, true);
$out = \preg_replace("#(?<!\r)\n#", PHP_EOL, $out);
if ($return) {
return $out;
}
echo $out;
return true;
}
每當你想使用它,你只需用
// 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_EOL
的換行符。請注意,它只會替換換行符,例如\n
,但沒有任何\r\n
您可能在$expression
。這是爲了防止任何\r\n
變爲\r\r\n
。
這樣做的好處是它可以作爲原生函數的替代替代品。因此,任何已經使用本地print_r
的代碼都可以簡單地通過添加use語句來替換。
'\ r \ n'是針對windows和'\ n'的,在linux上是 – meda