说我有一个字符串“Some text [login_form] some some text”。如何用PHP代码“require('somescript.php');”替换'[login_form]';“并运行'require'功能。
我不想使用'eval',因为我的字符串包含HTML和其他代码,并且很有可能出错。
答案 0 :(得分:1)
你可以这样做:
[\[(.*)\]]
$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
个文件,而是称为类或函数。它可以使用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],澄清一下你的意思吗?