我试图让我的客户端能够通过在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);
不太正常:(
答案 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
,则无法在替换中处理任意参数。