Как я могу создать переменную из ее вывода print_r? Другими словами, я хотел бы знать, существует ли что-то похожее на мою var_import
функцию var_import
в php? 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
.
EDIT: переменная доступна только как выход print_r (строка). Чтобы уточнить, что мне нужно, представьте себе следующую ситуацию: кто-то отправляет какой-то образец в Интернете где-то с выходом print_r. Чтобы проверить его код, вам нужно import
свою переменную print_r в свой код. Это пример использования var_import
.
Интересно, что руководство PHP содержит пример, который пытается воссоздать исходную структуру из вывода print_r:
print_r_reverse()
http://www.php.net/manual/en/function.print-r.php#93529
Однако это зависит от сохранения пробелов. Таким образом, вам понадобится фактический HTML-контент, а не выделенный текст, чтобы его снова подключить.
Также похоже, что он ничего не понимает, кроме массивов, и не спускается. Это было бы невероятно сложно, поскольку для строк не было реального маркера завершения, который может содержать новые строки и )
или даже [0]
и =>
которые могут быть ошибочно приняты за разделители print_r. Правильно перерисовать структуру print_r было бы почти невозможно даже с рекурсивным регулярным выражением (и фактическим парсером) – его можно было бы выполнить только путем догадки, как в коде, связанном выше. (Там есть еще две версии, возможно, вам нужно попробовать чтобы найти соответствие для вашего конкретного случая.)
Почему вместо этого вы не используете var_export
?
var_export(array(1, 2, 3)); // array(1, 2, 3)
Вы можете импортировать вывод var_export с помощью eval (), однако я бы рекомендовал вам как можно больше избежать этой функции.
Следующие функции лучше экспортировать и импортировать переменные:
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);
Вы можете обернуть его в выходной буфер:
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]+)\] \=\> ([az]+)/'; $m = preg_match_all($reg, $p, $ms); $new_ar = $ms[2]; echo "Your wanted result:\n"; print_r($new_ar);
Если вы хотите импортировать переменную 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) ); }
Я не умею регулярное выражение, чтобы закодировать окончательное удаление мусора. Вот как далеко я мог получить:
$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);
с$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 )