0

假设我有一个字符串“一些文本 [login_form] 一些其他文本”。如何将 '[login_form]' 替换为 PHP 代码“require('somescript.php');” 并运行“要求”功能。

我不想使用 'eval' 因为我的字符串包含 HTML 和其他代码,并且也很有可能出错。

4

3 回答 3

1

你可以这样做:

  1. 用正则表达式搜索[\[(.*)\]]
  2. $replace = include_once($matched_string);
  3. 替换[\[(.*)\]]$replace

唔?

也许这也可以工作:

$string = preg_replace_callback(
    '/\[(.*)\]/',
    function($matches) {
        ob_start();
        include $matches[1].'.php';
        return ob_get_clean();
    },
    $string
);

编辑:我在一些“自制” CMS 中看到了这种方法,但不是includeing 文件,它们都称为类或函数。它可以使用诸如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
);

这是你想要达到的吗?

于 2012-06-11T14:07:13.263 回答
0

只要 somescript.php 格式正确并且如果存在打开的 php 标记时有一个结束标记,eval 就可以工作,尽管我并不完全支持 eval。

eval('?>'.file_get_contents('somescript.php').'<?');

您能否用您拥有的代码示例替换 [login_form] 来澄清一下您的意思?

于 2012-06-11T14:05:44.610 回答
0

我认为 eval 是您在这里唯一的选择。如果你因为某些原因不想使用它(这可能是很好的理由),你就被卡住了。也许您可以提供更多背景信息,以便我们可以为您提供其他选择?

于 2012-06-11T14:02:09.793 回答