仅在括号内评估PHP代码

时间:2012-01-30 22:24:53

标签: php

我知道eval()不推荐使用{我不知道这不是一种安全的方法:

我只需要一个解决方案。

我想评估来自mySQL DB的字符串代码,但我想应用一个过滤器。

我的意思是eval()只有在括号{$code}内才需要评估代码。

我怎样才能做到这一点?

由于

4 个答案:

答案 0 :(得分:1)

$resultFromDb ='"blah blah blah {echo "Hello world";} blah blah blah';
preg_match('#\{(.*)\}#', $resultFromDb, $matches); // do your own error-checking here
$codeToEval = $matches[1];
eval($codeToEval);

答案 1 :(得分:1)

您可以使用preg_replace_callback(如果您不需要以前功能的上下文)。例如:

function runCode( $matches){
    eval( $matches[1]);
}

preg_replace_callback( '~\\{(.*?)\\}~', 'runCode', $text);

如果您需要上一个上下文,最好的方法是从$text创建临时文件并将{...}替换为<?php .... ?> ...

答案 2 :(得分:1)

使用 preg_replace_eval 可能是一个选项( preg_replace ,修饰符 e

示例:

$v='variable';
$i=123;
$s='this is a string';

$string = 'some {$v}  and a instruction {++$i;} and a function-call: {strtoupper($s)} ';

echo preg_replace('@\{([^\{\}]+)\}@e',
                  "$1",
                  $string);

返回:

some variable and a instruction 124 and a function-call: THIS IS A STRING 

答案 3 :(得分:0)

这是一个非常肮脏的解决方案:

$string = 'something {code} echo "hi"; {/code} something else {code} echo "more!"; {/code}';

preg_match_all('/{code}(.+){\/code}/U', $string, $matches);

foreach ($matches[1] as $match)
  eval($match);

我可能误解了,也许这就是你想要的:

$string = 'something {echo \'hi\';} something else {echo \'more!\';}';

preg_match_all('/{(.+)}/U', $string, $matches);

foreach ($matches[1] as $match)
  eval($match);