#php #regex #string #execute
#php #регулярное выражение #строка #выполнить
Вопрос:
Я хотел бы знать, возможно ли выполнить php-код в строке. Я имею в виду, если у меня есть:
$string = If i say <?php echo 'lala';?> I wanna get "<?php echo 'dada'; ?>";
Кто-нибудь знает как?
[ПРАВИТЬ / ПРАВИТЬ КОД]Похоже, что никто не понял. Я хочу сохранить строку, подобную
$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'; ?>"
Комментарии:
1. Пожалуйста, уточните свой вопрос. Какое значение здесь имеет строка? Итак, вы хотите иметь возможность определить, является ли данная строка допустимым PHP-кодом? Вы не сможете сделать это с помощью регулярного выражения.
2. Зависит от источника. Если это пользовательский ввод, я не могу рекомендовать
eval()
потому что души проклятых придут из глубин преисподней, чтобы мучить меня вечно. Также вас могут использовать, если вы не будете осторожны.3. Вы не можете использовать
<?php ?>
теги внутри<?php ?>
тега
Ответ №1:
$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'));
Это должно быть полезно для того, что вы хотите сделать.
Ответ №2:
Похоже, вы пытаетесь выполнить конкатенацию. Используйте оператор конкатенации «.»
$string = "if i say " . $lala . " I wanna get " . $dada;
или
$string = "if i say {$lala} I wanna get {$dada}.";
Это то, что я получаю, поскольку ваша строка выглядит как переменная php.
РЕДАКТИРОВАТЬ:
<?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 между тегами.
Комментарии:
1. это был пример. На самом деле я хочу использовать такие вещи, как <?php echo implode($ lalala); ?> или что-то в этом роде
Ответ №3:
Используйте token_get_all()
в строке, затем найдите T_OPEN_TAG
токен, начните копирование оттуда, найдите T_CLOSE_TAG
токен и остановитесь на этом. Строка между токеном рядом с T_OPEN_TAG
и до токена непосредственно перед T_CLOSE_TAG
— это ваш PHP-код.
Это быстро и не может привести к сбою, поскольку для разбора строки используется токенизатор PHP. Вы всегда найдете фрагменты PHP-кода внутри строки, даже если строка содержит комментарии или другие строки, которые могут содержать ?>
или любые другие связанные подстроки, которые могут запутать регулярные выражения или написанный от руки, медленный, чистый анализатор PHP.
Ответ №4:
Я бы не стал хранить ваши блоки PHP-кода в базе данных и оценивать их с помощью eval. Обычно есть лучшее решение. Прочитайте о шаблоне проектирования, ООП, полиморфизме.
Ответ №5:
Вы могли бы использовать функцию eval().
Комментарии:
1. Или (что еще лучше) не делайте этого, особенно если рассматриваемая строка получена из любой формы пользовательского ввода. 🙂
2. ДА. Вы должны быть очень осторожны при использовании eval.