6

我试图让我的客户能够通过在他们的所见即所得编辑器中插入一个短代码来调用具有各种代码片段的函数。

例如,他们会写类似...

[getSnippet(1)]

这将调用我的 getSnippet($id) php 函数并输出适当的“块”。

当我像这样对 $id 进行硬编码时,它会起作用......

echo str_replace('[getSnippet(1)]',getSnippet(1),$rowPage['sidebar_details']);

但是,我真的想让“1”动态化。我有点走在正确的轨道上,比如......

function getSnippet($id) {
 if ($id == 1) {
  echo "car";
 }
}

$string = "This [getSnippet(1)] is a sentence.This is the next one.";
$regex = '#([getSnippet(\w)])#';
$string = preg_replace($regex, '. \1', $string);

//If you want to capture more than just periods, you can do:
echo preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string);

不太工作:(

4

1 回答 1

0

首先,在您的正则表达式中,您需要添加文字括号(您刚刚捕获\w但与括号本身不匹配的括号):

$regex = '#(\[getSnippet\((\w)\)\])#';

我也转义了方括号,否则他们会打开一个字符类。另请注意,这仅捕获参数的一个字符!

但我建议你使用preg_replace_callback, 像这样的正则表达式:

function getSnippet($id) {
    if ($id == 1) {
        return "car";
    }
}

function replaceCallback($matches) {
    return getSnippet($matches[1]);
}

$string = preg_replace_callback(
    '#\[getSnippet\((\w+)\)\]#',
    'replaceCallback',
    $string
);

请注意,我将您的echoin更改getSnippetreturn.

在回调$matches[1]中将包含第一个捕获的组,在这种情况下是您的参数(现在允许多个字符)。当然,您也可以调整getSnippet函数以id$matches数组中读取 ,而不是通过replaceCallback.

但是这里的这种方法稍微灵活一些,因为它允许您重定向到多个函数。举个例子,如果您将正则表达式更改为#\[(getSnippet|otherFunction)\((\w+)\)\]#then 您可以找到两个不同的函数,并且replaceCallback可以在其中找到函数的名称$matches[1]并使用参数调用该函数$matches[2]。像这样:

function getSnippet($id) {
   ...
}

function otherFunction($parameter) {
   ...
}

function replaceCallback($matches) {
    return $matches[1]($matches[2]);
}

$string = preg_replace_callback(
    '#\[(getSnippet|otherFunction)\((\w+)\)\]#',
    'replaceCallback',
    $string
);

这真的取决于你想去哪里。重要的是,如果不使用 ,就无法处理替换中的任意参数preg_replace_callback

于 2012-10-29T19:12:36.450 回答