php替换正则表达式而不是字符串替换

c.d*_*ies 6 php regex

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

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

[getSnippet(1)]
Run Code Online (Sandbox Code Playgroud)

这将调用我的getSnippet($ id)php函数并输出相应的"块".

当我像这样硬编码$ id时,它有效...

echo str_replace('[getSnippet(1)]',getSnippet(1),$rowPage['sidebar_details']);
Run Code Online (Sandbox Code Playgroud)

但是,我真的想让'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);
Run Code Online (Sandbox Code Playgroud)

不太正常:(

Mar*_*der 0

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

$regex = '#(\[getSnippet\((\w)\)\])#';
Run Code Online (Sandbox Code Playgroud)

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

但我建议您使用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
);
Run Code Online (Sandbox Code Playgroud)

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

回调中将$matches[1]包含第一个捕获的组,在本例中是您的参数(现在允许多个字符)。当然,您也可以调整函数以从数组中getSnippet读取,而不是通过 重定向。id$matchesreplaceCallback

但这种方法稍微灵活一些,因为它允许您重定向到多个函数。举个例子,如果您将正则表达式更改为,#\[(getSnippet|otherFunction)\((\w+)\)\]#那么您可以找到两个不同的函数,并且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
);
Run Code Online (Sandbox Code Playgroud)

这实际上取决于你想做什么。重要的是,如果不使用 则无法处理替换中的任意参数preg_replace_callback