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

时间:2012-10-29 18:56:42

标签: php regex

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

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

[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);

不太正常:(

1 个答案:

答案 0 :(得分: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
);

请注意,我已将echo中的getSnippet更改为return

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

但这种方法稍微灵活一些,因为它允许您重定向到多个功能。举个例子,如果您将正则表达式更改为#\[(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
);

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