gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:32:10 26 4
gpt4 key购买 nike

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

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

[getSnippet(1)]

这将调用我的 getSnippet($id) php 函数并输出适当的“ block ”。

当我像这样对 $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);

不太好:(

最佳答案

首先,在您的正则表达式中,您需要添加文字括号(您刚刚捕获的括号 \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 中的 echo 更改为 return

在回调中 $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,就无法处理替换中的任意参数。

关于php替换正则表达式而不是字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13127924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com