Как разобрать код PHP в массиве PHP? - PullRequest
0 голосов
/ 06 января 2012

Я использую этот код код на моем сайте. Если в массиве есть код PHP, и если вы его отображаете, он не запускается.

Есть кусок кода;

function spin($var){
$words = explode("{",$var);
foreach ($words as $word)
{
    $words = explode("}",$word);
    foreach ($words as $word)
    {
        $words = explode("|",$word);
        $word = $words[array_rand($words, 1)];        
        echo $word." ";

    }

}
}

$text = "example.com is {the best forum|a <? include(\"myfile.php\");?>Forum|a wonderful Forum|a perfect Forum} {123|some other sting}";
spin($text);

Файл, который нужно включить " myfile.php ", не будет включен. и коды PHP будут видны. Это почему? Как я могу решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Я полагаю, что вы захотите выполнить оператор включения через eval(). Однако обратите внимание, что:

"Языковая конструкция eval () очень опасна, поскольку она позволяет выполнять произвольный код PHP. Поэтому его использование не рекомендуется. Если вы тщательно убедились, что нет другого выбора, кроме как использовать эту конструкцию, обратите особое внимание на то, чтобы передавать любые предоставленные пользователем данные без предварительной проверки. " (PHP.net)

ИСТОЧНИК: http://php.net/manual/en/function.eval.php

Вы можете попробовать следующее:

<?php
  function spin($var)
  {
     $words = explode("\{",$var);
        foreach ($words as $word)
        {
           $words = explode("}",$word);
           foreach ($words as $word)
           {
              $words = explode("|",$word);
              $word = $words[array_rand($words, 1)];        

              if ( preg_match( "/\<\? include\(\\\"([A-Za-z\.]+)\\\"\)\;\?\>/", $word ) )
              {
                 $file = preg_replace( "/^.*\<\? include\(\\\"([A-Za-z\.]+)\\\"\)\;\?\>.*\$/", "\$1", $word );
                 $pre = preg_replace( "/^(.*)\<\? include\(\\\"[A-Za-z\.]+\\\"\)\;\?\>.*\$/", "\$1", $word );
                 $post = preg_replace( "/^.*\<\? include\(\\\"[A-Za-z\.]+\\\"\)\;\?\>(.*)\$/", "\$1", $word );

                 echo $pre;
                 include( $file );
                 echo $post;
              }
          }
      }
   }

   $text = "example.com is {the best forum|a <? include(\"myfile.php\");?>Forum|a          wonderful Forum|a perfect Forum} {123|some other sting}";
   spin($text);
?>
1 голос
/ 06 января 2012

Мое предложение немного другое,

function spin($var){
$words = explode("{",$var);
foreach ($words as $word)
{
    $words = explode("}",$word);
    foreach ($words as $word)
    {
        $words = explode("|",$word);
        $word = $words[array_rand($words, 1)];
        if(str_replace(" ","",$word) == 'thisparam'){
            echo 'a'; 
                include("myfile.php");
            echo 'Forum';
        }else{
            echo $word." ";
        }
    }
}
}

$text = "example.com is {the best forum| thisparam |a wonderful Forum|a perfect Forum} {123|some other sting}";
spin($text);

где thisparam - ваша переменная $ test - параметр для запуска оператора if. Я помещаю str_replace перед $ word, чтобы заменить строки, чтобы получить точное слово.

0 голосов
/ 06 января 2012

Ну, это всего лишь строка текста. Эхо просто выведет текст ...

Я предлагаю вам воспользоваться eval http://php.net/manual/en/function.eval.php

Хотя я не могу точно сказать, почему вы хотите это сделать. Всякий раз, когда мне нужно использовать eval и друзей, я перестаю думать «Должен ли я делать это?»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...