我希望用户能够包含php代码块,如联系表单,搜索表单。
像
这样的东西<? include 'contact.inc.php' ?>
现在,Wordpress通过使用Shortcodes来实现这一点,即
[contact-form] [search form]
我怎样才能轻松完成这项工作?
我的包含数量有限
我可以用
eval('?> ' . $database_query . ' <?php ');
并放
<? include('contact.inc.php') ; ?>
在$ database_query
的内容中但在这种情况下eval()是危险的
那么如何制作一个简单的短代码系统?
答案 0 :(得分:0)
如果可以,我会尽量避免eval。 eval的问题,特别是表单输入的问题是,如果被利用,您将授予攻击者访问整个Web服务器的权限。我建议使用一些寻找显式短代码的服务器端脚本。您甚至可以使用Wordpress function that they use作为起点。您还可以使用preg_match
在文本中搜索短代码并以此方式解析它们。任何一个选项都会优于eval()
答案 1 :(得分:0)
假设您已经从某个地方(例如数据库)加载了一些包含短代码的HTML,并且您希望在内部填写表单的内容,我会执行以下操作:
// Define known shortcodes
$shortcodes = array(
"[contact-form]" => "contact.inc.php",
"[search-form]" => "search.inc.php"
);
// Load HTML with shortcodes from wherever you want
$source = load_template_from_somewhere();
// Now let's find the shortcodes in your source
$replace_points = array();
foreach($shortcodes as $code => $include_me){
$offset = 0;
while(TRUE){
$index = strpos($source, $code, $offset);
if($index === FALSE){
// No more shortcodes of this type found
break;
};
// Save the position and name of shortcode
$replace_points[$index] = $code;
// Update offset to scan the source search the remaining part of the string
$offset = $index + strlen($code);
};
};
// Sort the array because we've been searching by shortcode names
// And now we need to include forms in the correct order
ksort($replace_points);
$offset = 0;
foreach($replace_points as $index => $code){
// Echo raw HTML part of the string
echo substr($source, $offset, $index);
// Then include the form
include($shortcodes[$code]);
// Update the offset to move towards the end of the string
$offset = $index + strlen($code);
};
// Echo the remaining part of raw HTML string
echo substr($source, $offset);