PHP不那么简单(对我来说)搜索&使用preg_match_all替换

时间:2015-02-27 16:49:28

标签: php regex

我试图创建一个系统,用户可以在其中输入短语到富文本编辑器,例如' {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块的函数

3 个答案:

答案 0 :(得分:0)

这对我有用:

 {item\(([\d]+)\)}

结帐eval

答案 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应该有替换后的字符串。