我目前正在尝试使用PHP将令牌添加到CMS。
用户可以输入(进入WYSIWYG编辑器)字符串,例如[my_include.php]
。我们想用这种格式提取任何内容,并将其转换为以下格式的包含:
include('my_include.php');
任何人都可以协助编写RegExp和提取过程来实现此目的吗?理想情况下,我想将它们全部提取到一个数组中,以便我们可以在解析它之前提供一些检查include();
?
谢谢!
答案 0 :(得分:3)
preg_replace('~\[([^\]]+)\]~', 'include "\\1";', $str);
答案 1 :(得分:2)
你要么想要使用preg_match_all(),要在循环中运行结果并替换你找到的任何内容。可能比以下回调解决方案快一点,但如果使用PREG_OFFSET_CAPUTRE和substr_replace(),则有点棘手。
<?php
function handle_replace_thingie($matches) {
// build a file path
$file = '/path/to/' . trim($matches[1]);
// do some sanity checks, like file_exists, file-location (not that someone includes /etc/passwd or something)
// check realpath(), file_exists()
// limit the readable files to certain directories
if (false) {
return $matches[0]; // return original, no replacement
}
// assuming the include file outputs its stuff we need to capture it with an output buffer
ob_start();
// execute the include
include $file;
// grab the buffer's contents
$res = ob_get_contents();
ob_end_clean();
// return the contents to replace the original [foo.php]
return $res;
}
$string = "hello world, [my_include.php] and [foo-bar.php] should be replaced";
$string = preg_replace_callback('#\[([^\[]+)\]#', 'handle_replace_thingie', $string);
echo $string, "\n";
?>
答案 2 :(得分:0)
使用preg_match_all()
,您可以这样做:
$matches = array();
// If we've found any matches, do stuff with them
if(preg_match_all("/\[.+\.php\]/i", $input, $matches))
{
foreach($matches as $match)
{
// Any validation code goes here
include_once("/path/to/" . $match);
}
}
此处使用的正则表达式为\[.+\.php\]
。这将匹配任何*.php
字符串,以便在用户输入[hello]
时,它将不匹配。