Создать переменную из вывода print_r

Как я могу создать переменную из ее вывода 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 )