2012-10-29 176 views
6

我试图让我的客户端通过在他们的所见即所得编辑器中插入一个简短代码来调用具有各种代码片段的函数。php替换正则表达式而不是字符串替换

例如,他们会喜欢写东西......

[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

什么不适用于您的代码? – hakre

+0

看看'preg_replace_callback()'。它允许您提供一个函数,该函数接收由正则表达式匹配的字符串的位,并返回替换。 – Barmar

回答

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

请注意,我在你的getSnippet改变echoreturn

在回调$matches[1]内将包含第一个捕获组,在这种情况下是您的参数(现在允许多个字符)。当然,你也可以调整你的getSnippet函数从$matches数组中读取id而不是通过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的情况下,无法在替换中处理任意参数。

+0

非常感谢您的快速回复。这一点看起来非常接近。当我使用字符串,如... '$ string =“[getSnippet(1)] this ijioj oiajs dfoij dsofij aoisfj oiasdfj。[getSnippet(2)] adfas asd as f。”;' 我只是从函数返回文本,但丢失其他文本... 'ie:汽车。船。' 但它应该是... '再次 “车。这ijioj oiajs dfoij dsofij aoisfj oiasdfj。船。adfas ASD为f。”' 感谢。 –

+0

你的答案非常符合我的要求,只是我的句子中的其他文字被删除。只剩下由函数调用返回的文本。再次感谢。 –

+0

请将'getSnippet'中的'echo'改为'return'。我以为我改变了这一点,但显然我在那里做了一些复制粘贴错误。 –