Hack Alert! Вы можете выполнить оценку PHP самостоятельно с небольшим количеством взлома, используя preg_replace_callback
для поиска и замены блоков PHP.
function evalCallback($matches)
{
// [0] = <?php return returnOrEcho("hi1");?>
// [1] = <?php
// [2] = return returnOrEcho("hi1");
// [3] = ?>
return eval($matches[2]);
}
function evalPhp($file)
{
// Load contents
$contents = file_get_contents($file);
// Add returns
$content_with_returns = str_replace(
"returnOrEcho"
,"return returnOrEcho"
,$contents);
// eval
$modified_content = preg_replace_callback(
array("|(\<\?php)(.*)(\?\>)|"
,"evalCallback"
,$content_with_returns);
return $modified_content;
}
Вам потребуется изменить файл PHP, который вы включаете, чтобы использовать функцию returnOrEcho
, чтобы она могла быть перегружена для этого случая и обычного случая. В этом случае вы хотите return
, чтобы eval
воспринял его так, как вы хотите, но обычный случай - echo
без возврата.
Итак, для этого случая вы должны определить:
function returnOrEcho($str)
{
return $str;
}
и для обычного случая вы бы определили:
function returnOrEcho($str)
{
echo $str;
}
В вашем включенном PHP-файле (или в файле просмотра) у вас будет что-то вроде этого:
<?php returnOrEcho("hi1");?>
<?php returnOrEcho("hi3"."oo");?>
<?php returnOrEcho(6*7);?>
Я не смог заставить работать preg_replace_callback
встроенный обратный вызов, поэтому я использовал отдельную функцию, но есть пример того, как это сделать: preg_replace_callback () - обратный вызов внутри текущего экземпляра объекта .