如何对数据库中存储的PHP代码使用eval()?

时间:2018-08-19 18:09:52

标签: php

数据库中存在完整的HTML代码,其中包括以下HTML代码-

<p class="card mb-4 shadow-sm"><img src="<?php echo SITE_URL; ?>/assets/images/blog/php.png" alt="php" title="php"></p>

此HTML存储在db中,并且我希望它在获取时输出SITE_URL的值,因为SITE_URL是动态的(在这种情况下为const)。

我尝试使用PHP自己的eval()函数,如本article中提到的那样。但这不起作用。

什么是更好的方法? 还有其他方法可以解决这个问题吗?

在这里,我尝试过。

<p class="card mb-4 shadow-sm"><img src="<?php 
$str = SITE_URL;
eval('\$str = \'$str\';');
echo $str; ?>/assets/images/blog/php.png" alt="php" title="php"></p> 

1 个答案:

答案 0 :(得分:1)

假设您知道使用eval是多么狡猾。.

只要定义了SITE_URL,就可以了。然后您将执行以下操作:

<?php
define('SITE_URL', 'http://example.com');

$str = '<p class="card mb-4 shadow-sm"><img src="<?php echo SITE_URL; ?>/assets/images/blog/php.png" alt="php" title="php"></p>';

echo eval('?>'.$str);

https://3v4l.org/EEB54


使用eval的另一种方法是使用模板,并将占位符替换为您定义的值。

<?php
define('SITE_URL', 'http://example.com');

$vars = [
    'SITE_URL' => SITE_URL    
];

$template = '<p class="card mb-4 shadow-sm"><img src="{{ SITE_URL }}/assets/images/blog/php.png" alt="php" title="php"></p>';

// match any single word with _ or -, with spaces either side or not
// e.g: {{key}} or {{ key }} or {{key-foo}} or {{ key-foo }}
//  not {{ a b c }}
$str = preg_replace_callback("/{{[ ]{0,}([\w\_-]{1,})[ ]{0,}}}/", function ($match) use ($vars) {
    return array_key_exists($match[1], $vars) ? $vars[$match[1]] : '';
}, $template);


echo $str;

https://3v4l.org/cUK5B

或者如果需要更多功能,可以考虑使用模板引擎。