我正在为内容管理器开发BB代码系统,我希望能够在我的textarea中使用[code=php]<?php echo "Hello World!"; ?>[/code]
之类的东西。使用GeSHi(语法高亮显示)我已经使用以下函数来解析代码:
function parsecode($codetype) {
$source = file_get_contents("file.php");
$language = $codetype;
$geshi = new GeSHi($source, $language);
echo '<code class="num">', implode(range(1,count(file("file.php"))), "<br />"), "</code>";
echo $geshi->parse_code();
}
这完全没问题!
现在这是BB代码的用武之地。使用preg_replace我创建了一个简单的系统来查找和替换代码:
$find = array(
"/\[code\=(.+?)\](.+?)\[\/code\]/is"
);
$replace = array(
'<?php parsecode("$1"); ?>'
);
是的,现在这意味着它只读取语言并解析文件“file.php”,但最终我的工作会有所不同,但现在这并不重要。
会发生什么,BB代码是否正确执行,结果是它确实执行了代码,但它不执行函数parsecode()
。我进行了一些小调整以找出问题所在,并将其保存到文件中,结果显示该文件包含以下内容:<?php parsecode("php"); ?>
。这正是它应该包含的内容。当我在文件中写下这行代码时,它会执行。
在textarea中提交的任何内容都存储在一个文件中,然后使用fopen()
读取,然后在另一页上回显。
我的问题:为什么功能不执行&amp;像它应该解析代码?
提前致谢!
答案 0 :(得分:1)
只有一种方法可以让PHP代码在PHP代码中执行(动态更改代码),并使用eval()。
http://www.php.net/manual/en/function.eval.php
这让你动态制作代码并执行它
请记住这句话: “如果eval()就是答案,你几乎肯定会问错误的问题。 - Rasmus Lerdorf,PHP的BDFL”
eval()以安全漏洞而闻名并被利用。非常不推荐。 但是,只要你没有在eval中使用用户生成的代码就可以了。您可以在其周围进行返回以仅在数据库中获得结果。
你可以通过在脚本中运行它来实现相同的效果,但不能在它在条目中运行之前替换它,而是在论坛页面本身上...