我试图创建一个系统,用户可以在其中输入短语到富文本编辑器,例如' {item(5)}',然后当代码在页面上呈现内容时前端' {item(5)}'被替换为使用5作为唯一标识符的代码/函数片段
我想类似于wordpress小部件的工作方式,
我不熟悉使用preg_函数,但设法拔出{item(5)}并替换为函数,但问题是它删除了其余的内容。
我可能不会在正确的路线上,但到目前为止这里是代码,任何帮助都将非常感激
$string ='This is my body of text, you should all check out this item {item(7)} or even this item {item(21)} they are great...';
if(preg_match_all('#{item((?:.*?))}#is', $string, $output, PREG_PATTERN_ORDER))
$matches = $output[0];
foreach($matches as $match){
item_widget(preg_replace("/[^0-9]/", '', $match));
}
item_widget只是一个使用该数字来显示html块的函数
答案 0 :(得分:0)
答案 1 :(得分:0)
您可能需要preg_replace_callback
代替:
$output = preg_replace_callback('/\{item\((\d+)\)\}/', function($match) {
// item_widget should *return* its result for you to insert into your stream
return item_widget($match[1]);
}, $string);
这会将{item(n)}
标记替换为相关的小部件结果,假设 - 如代码注释中所述 - 它实际返回其代码。
答案 2 :(得分:0)
所以这个问题有两个部分。首先,您需要编写标记提取部分,然后编写替换部分:
<?php
$in = "foo bar {item(1)} {item(2)}";
$out = $in;
if ($m = preg_match_all("/({item\([0-9]+\)})/is",$in,$matches)){
foreach ($matches[1] as $match){
preg_match("/\(([0-9]+)\)/", $match, $t);
$id = $t[1];
/* now we have id, do the substitution */
$out = preg_replace("/".preg_quote($match) . "/", "foo($id)", $out);
}
}
现在$out
应该有替换后的字符串。