从print_r输出创建变量

时间:2011-08-29 14:50:08

标签: php

如何从print_r输出创建变量?换句话说,我想知道在php中是否存在类似于我的虚构var_import函数的东西? var_import将与var_export

相反

他是一个用例:

$a = var_import('Array ( [0] => foo [1] => bar )');
$output = var_export($a);
echo $output; // Array ( [0] => foo [1] => bar )

如果不存在这样的功能,是否有工具(或在线工具)来执行此操作? 我也有兴趣对var_dump输出做同样的事情。

编辑:该变量仅作为print_r输出(字符串)。为了阐明我需要的东西,想象下面的情况:有人在某个地方用print_r输出发布了一些样本。要测试他的代码,您需要将import他的print_r变量放入代码中。这是var_import有用的示例。

5 个答案:

答案 0 :(得分:18)

有趣的是,PHP手册包含一个尝试从print_r输出重新创建原始结构的示例:
print_r_reverse()
 http://www.php.net/manual/en/function.print-r.php#93529

然而,它确实依赖于保留的空白。所以你需要实际的HTML内容,而不是渲染的文本来管道它。

除了数组之外,它看起来不会理解任何东西,也不会下降。这将非常困难,因为字符串没有真正的终止标记,它们都可能包含换行符)甚至[0]=>,这可能会被误认为是print_r分隔符。使用递归正则表达式(和实际的解析器)正确地重新解析print_r结构几乎是不可能的 - 它只能通过上面链接的代码中的猜测分裂来完成..(还有两个版本,也许你必须尝试他们通过为您的具体案例找到匹配。)

答案 1 :(得分:10)

为什么不使用var_export

var_export(array(1, 2, 3)); // array(1, 2, 3)

您可以使用eval()导入 var_export的输出,但我建议您尽可能避免使用此功能。

以下功能更适合导出导入变量:

serialize()unserialize()

$string = serialize(array(1, 2, 3));
$array = unserialize($string); // array(1, 2, 3);

json_encode()json_decode()

$string = json_encode(array(1, 2, 3));
$array = json_decode($string);

答案 2 :(得分:2)

您可以将其包装在输出缓冲区中:

ob_start();
print_r(array(1,2,3));
$arr = ob_get_clean();
echo $arr;

好的,所以我误解了第一个问题。我想我有另一个解决方案,它确实回答了你的问题:

<?php
$ar = array('foo','bar');
$p = print_r($ar, true);

$reg = '/\[([0-9]+)\] \=\> ([a-z]+)/';
$m = preg_match_all($reg, $p, $ms);

$new_ar = $ms[2];

echo "Your wanted result:\n";
print_r($new_ar);

答案 3 :(得分:0)

如果要导入var_export()的变量,可以运行eval()函数。 或者,如果将内容保存到文件中(带有return语句),则可以使用include()require()的返回值。

但我宁愿使用serialize()unserialize()json_encode()json_decode()

define('EXPORT_JSON', 1);
define('EXPORT_SERIALIZE', 2);

function exportIntoFile($var, $filename, $method=EXPORT_JSON)
{
  if ( $method & EXPORT_JSON )
    file_put_contents( $filename, json_encode($var) );
  else if ($method & EXPORT_SERIALIZE)
    file_put_contents( $filename, serialize($var) );
}
function importFromFile($filename, $method=EXPORT_JSON)
{
  if ( $method & EXPORT_JSON )
    return json_decode( file_get_contents($filename) );
  else if ($method & EXPORT_SERIALIZE)
    return unserialize( file_get_contents($filename) );
}

答案 4 :(得分:0)

我不擅长正则表达式来编写最终的垃圾清除代码。 Here我能走得多远:

$str = 'Array ( [0] => foo [1] => bar [2] => baz)';
$t1 = explode('(', $str);
$t2 = explode(')', $t1[1]);
$t3 = explode(' => ', $t2[0]);
unset($t3[0]);

print_r($t3);

输出:

Array
(
    [1] => foo [1]
    [2] => bar [2]
    [3] => baz
)