假设我有一个字符串“一些文本 [login_form] 一些其他文本”。如何将 '[login_form]' 替换为 PHP 代码“require('somescript.php');” 并运行“要求”功能。
我不想使用 'eval' 因为我的字符串包含 HTML 和其他代码,并且也很有可能出错。
假设我有一个字符串“一些文本 [login_form] 一些其他文本”。如何将 '[login_form]' 替换为 PHP 代码“require('somescript.php');” 并运行“要求”功能。
我不想使用 'eval' 因为我的字符串包含 HTML 和其他代码,并且也很有可能出错。
你可以这样做:
[\[(.*)\]]
$replace = include_once($matched_string);
[\[(.*)\]]
为$replace
唔?
也许这也可以工作:
$string = preg_replace_callback(
'/\[(.*)\]/',
function($matches) {
ob_start();
include $matches[1].'.php';
return ob_get_clean();
},
$string
);
编辑:我在一些“自制” CMS 中看到了这种方法,但不是include
ing 文件,它们都称为类或函数。它可以使用诸如Hey, check out this new gallery: [gallery, 15, 200, 200]
.
您解析该字符串并发现您必须调用 object $gallery
,可能是一个方法view
,其参数15, 200, 200
将是每页显示多少张图像和图像缩略图分辨率......所以您将调用$gallery->view(15, 200, 200);
.
在这种情况下,上面的 PHP 代码将被扩展为:
$string = preg_replace_callback(
'/\[(.*)\]/',
function($matches) {
$params = explode(', ', $matches[1]); // by this we get an array with object name and all the parameters
$object = array_shift($params);
return ${$object}->view($params); // for simplicity we pass parameters as an array
},
$string
);
这是你想要达到的吗?
只要 somescript.php 格式正确并且如果存在打开的 php 标记时有一个结束标记,eval 就可以工作,尽管我并不完全支持 eval。
eval('?>'.file_get_contents('somescript.php').'<?');
您能否用您拥有的代码示例替换 [login_form] 来澄清一下您的意思?
我认为 eval 是您在这里唯一的选择。如果你因为某些原因不想使用它(这可能是很好的理由),你就被卡住了。也许您可以提供更多背景信息,以便我们可以为您提供其他选择?