Подтвердить что ты не робот

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

Как я могу создать переменную из нее print_r output? Другими словами, я хотел бы знать, существует ли что-то похожее на мою фиктивную функцию 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 был бы полезен.

4b9b3361

Ответ 1

Интересно, что руководство по PHP содержит пример, который пытается воссоздать исходную структуру из вывода print_r:
print_r_reverse()
 http://www.php.net/manual/en/function.print-r.php#93529

Однако это зависит от сохранения пробелов. Таким образом, вам понадобится фактический HTML-контент, а не визуализированный текст, чтобы передать его обратно.

Также не похоже, что он ничего не понимает, кроме массивов, и не спускается. Это было бы невероятно сложно, поскольку для строк не было реального маркера завершения, который может содержать новые строки и ) или даже [0] и =>, которые могут быть ошибочно приняты за разделители print_r. Правильно перерисовать структуру print_r было бы почти невозможно даже с рекурсивным регулярным выражением (и фактическим парсером) - его можно было бы выполнить только путем догадки, как в коде, связанном выше. (Там есть еще две версии, возможно, вам нужно попробовать чтобы найти соответствие для вашего конкретного случая.)

Ответ 2

Почему бы вам не использовать 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);

Ответ 3

Вы можете обернуть его в выходной буфер:

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);

Ответ 4

Если вы хотите импортировать переменную 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) );
}

Ответ 5

Я не умею регулярное выражение, чтобы закодировать окончательное удаление мусора. Вот, насколько я мог получить:

$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
)