如何从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
有用的示例。
答案 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的输出,但我建议您尽可能避免使用此功能。
以下功能更适合导出和导入变量:
$string = serialize(array(1, 2, 3));
$array = unserialize($string); // array(1, 2, 3);
$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
)