我试图让我的客户端能够通过在他们的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)
不太正常:(
首先,在正则表达式中,您需要添加文字括号(您刚刚捕获的括号\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请注意,我将您中的更改getSnippet为return.
回调中将$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。