执行部分存储在字符串中的PHP代码

时间:2012-06-11 14:00:09

标签: php

说我有一个字符串“Some text [login_form] some some text”。如何用PHP代码“require('somescript.php');”替换'[login_form]';“并运行'require'功能。

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

3 个答案:

答案 0 :(得分:1)

你可以这样做:

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

    也许这也可行:

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

    编辑:我在一些“自制”CMS中看到了这种方法,但它们不是include个文件,而是称为类或函数。它可以使用Hey, check out this new gallery: [gallery, 15, 200, 200]等参数进行扩展。

    您解析该字符串并发现您必须调用对象$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
    );
    

    这是你想要达到的目标吗?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

只要somescript.php格式正确并且如果存在开放的php标记就有一个结束标记,eval将会起作用,尽管我不是全部用于eval。

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

你能用你的代码示例替换[login_form],澄清一下你的意思吗?