идентификация и выполнение php-кода в строке

#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.