определить и выполнить код php на строку - PullRequest
1 голос
/ 24 мая 2011

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

$string = If i say <?php echo 'lala';?> I wanna get "<?php echo 'dada'; ?>";

Кто-нибудь знает, как?

[EDIT] Похоже, никто не понял.Я хочу сохранить строку типа

$string = If i say <?php count(array('lala'));?>

в базе данных, а затем отрендерить ее.Я могу сделать это, используя

function render_php($string){
    ob_start();
    eval('?>' . $string);
    $string = ob_get_contents();
    ob_end_clean();
    return $string;
}

Проблема в том, что я не преобразовываю php-код в "" (кавычки), как

I say "<?php echo 'dada'; ?>"

Ответы [ 5 ]

2 голосов
/ 24 мая 2011
$string = ($test === TRUE) ? 'lala' : 'falala';

Есть много способов сделать то, что, похоже, вы пытаетесь сделать (если я читаю то, что вы написали правильно).Выше это троичный.Если условие оценивается как true, то для $ string будет установлено значение 'lala', в противном случае будет установлено значение 'falala'.

Если вы буквально спрашиваете, что вы написали, используйте функцию eval ().Он принимает переданную строку и выполняет ее, как если бы это был PHP-код.Не включайте теги <?php ?>.

function dropAllTables() {
    // drop all tables in db
}

$string = 'dropAllTables();';

eval($string); // will execute the dropAllTables() function

[править]

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

preg_match_all('/(<\?php )(.+?)( \?>)/', $string, $php_code, PREG_OFFSET_CAPTURE);

$ php_code будет массивом, где $ php_code [0] будет возвращать массив всех совпадений с тегами code + <?php ?>.$ php_code [2] будет массивом только с кодом для выполнения.

Итак,

$string = "array has <?php count(array('lala')); ?> 1 member <?php count(array('falala')); ?>";
preg_match_all('/(<\?php )(.+?)( \?>)/', $string, $php_code, PREG_OFFSET_CAPTURE);
echo $php_code[0][0][0]; // <?php count(array('lala')); ?>
echo $php_code[2][0][0]; // count(array('lala'));

Это должно быть полезно для того, что вы хотите сделать.

1 голос
/ 24 мая 2011

Похоже, вы пытаетесь объединить. Используйте оператор конкатенации "."

$string = "if i say " . $lala . " I wanna get " . $dada;

или

$string = "if i say {$lala} I wanna get {$dada}.";

Это то, что я получаю, так как ваша строка выглядит как переменная php.

EDIT: <?php ?> используется, когда вы хотите сказать интерпретатору PHP, что код в этих скобках должен интерпретироваться как PHP. При работе в этих скобках PHP вам не нужно включать их снова. Итак, как вы могли бы просто сделать это:

// You create a string:
$myString = "This is my string.";

// You decide you want to add something to it.
$myString .= getMyNameFunction(); // not $myString .= <?php getMyNameFunction() ?>;

Строка создается, затем к ней добавляются результаты getMyNameFunction (). Теперь, если вы объявили переменную $ myString в верхней части своей страницы и хотите использовать ее позже, вы сделаете это:

<span id="myString"><?php echo $myString; ?></span>

Это скажет интерпретатору добавить содержимое переменной $ myString между тегами.

0 голосов
/ 21 июня 2011

Я бы не стал хранить ваши блоки кода PHP в базе данных и оценивать их с помощью eval.Обычно есть лучшее решение.Читайте о Design Pattern, ООП, Полиморфизм.

0 голосов
/ 25 мая 2011

Используйте token_get_all() в строке, затем найдите токен T_OPEN_TAG, начните копирование оттуда, найдите токен T_CLOSE_TAG и остановитесь на этом. Строка между токеном рядом с T_OPEN_TAG и до токена прямо перед T_CLOSE_TAG является вашим PHP-кодом.

Это быстро и не может завершиться ошибкой, так как он использует токенайзер PHP для анализа строки. Внутри строки вы всегда найдете фрагменты кода PHP, даже если строка содержит комментарии или другие строки, которые могут содержать ?>, или любые другие связанные подстроки, которые могут запутать регулярные выражения или написанный вручную, медленный, чистый синтаксический анализатор PHP.

0 голосов
/ 24 мая 2011

Вы можете использовать функцию eval () .

...