Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在括号内计算PHP代码_Php - Fatal编程技术网

仅在括号内计算PHP代码

仅在括号内计算PHP代码,php,Php,我知道不建议使用eval(),我知道这一点,我不需要知道这不是一种安全的方法:) 我只需要一个解决方案 我想计算来自mySQL数据库的字符串的代码,但我想应用一个过滤器 我的意思是eval()只有在括号内{$code}时才必须计算代码 我怎样才能做到这一点 谢谢这是一个非常肮脏的解决方案: $string = 'something {code} echo "hi"; {/code} something else {code} echo "more!"; {/code}'; preg_match

我知道不建议使用
eval()
,我知道这一点,我不需要知道这不是一种安全的方法:)

我只需要一个解决方案

我想计算来自mySQL数据库的字符串的代码,但我想应用一个过滤器

我的意思是
eval()
只有在括号内
{$code}
时才必须计算代码

我怎样才能做到这一点


谢谢

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

$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);
您可以使用(如果您不需要前面函数的上下文)。例如:

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

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

如果您需要以前的上下文,最好的方法是从
$text
创建临时文件,并用
替换
{…}

使用preg\u replace\u eval可能是一个选项(preg\u 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 

我建议将代码放在一个单独的脚本中,并使用PHP-CLI在不执行任何操作的情况下验证语法。@DiegoP您不清楚整个字符串是否在大括号中,大括号是否出现在较大的字符串中,或者在后一种情况下是否不同
{$code}
chunk可以多次出现,或者您是否希望将
eval()
结果重新插入到您最初分配了提取字符串的字符串变量中。我认为只有在字符串中找到一个变量时,它才会起作用。当字符串中有许多变量时会发生什么,例如:{$foo}{echo$hello}等等。。还要记住,我不知道字符串中会包含哪些变量。你在问题中没有提到这一点。您可以使用
preg\u match\u all()
查找所有匹配项,而不仅仅是第一个。@DiegoP:我知道您只需要一个解决方案,但您是否想过将PHP本身用作模板引擎,而不是编写自己的模板引擎?为什么要写
{$foo}{$hello}
而不是
?它是
preg\u replace\u回调
)不,我的意思是preg\u replace\u eval,它不是一个真正的函数,它是preg\u replace()的别名,当与e-modifier一起使用时,请参阅手册以了解更多细节。<未找到任何内容,能否提供链接?为什么不使用preg\u replace\u回调?它应该被优化。你必须选择“在线文档”进行搜索,然后你会发现,例如,啊,我习惯用大写字符串来写常量,用函数名(小写)来写会让人困惑。在添加示例+1之后。
some variable and a instruction 124 and a function-call: THIS IS A STRING