Php 替换文本块中的特定值,留下介于搜索内容之间的文本

Php 替换文本块中的特定值,留下介于搜索内容之间的文本,php,Php,我想将此文本{unsubscribe | here.}转换为 我已经编写了一个正则表达式来提取不同的匹配组 在这种情况下,我知道我可以preg/str_替换文本的前面和结尾(}),但是这将是无效的,因为我还想去掉另一个类似的值,例如{name} 这是我写的正则表达式/(\{unsubscribe\\\)([a-z]*[^\}])(\})/ 谢谢,$str='{unsubscribe}{name}这里。}; $str = '{unsubscribe|{name} here.}'; functio

我想将此文本
{unsubscribe | here.}
转换为

我已经编写了一个正则表达式来提取不同的匹配组

在这种情况下,我知道我可以preg/str_替换文本的前面和结尾(
}
),但是这将是无效的,因为我还想去掉另一个类似的值,例如
{name}

这是我写的正则表达式<代码>/(\{unsubscribe\\\)([a-z]*[^\}])(\})/

谢谢,

$str='{unsubscribe}{name}这里。};
$str = '{unsubscribe|{name} here.}';

function fix($m){
    return "<a href=''>".str_replace("{name}", "MY NAME", $m[1])."</a>";
}
print preg_replace_callback("/\{unsubscribe\|(.*)\}/", "fix", $str);
功能修复(百万美元){ 返回“”; } 打印preg\u replace\u回调(“/\{unsubscribe\\\|(.*)\}/”、“fix”、$str);
输出:

<a href=''>MY NAME here.</a>

这将去除字符串的不同部分,并在必要时进行更换

我根据@waza123的答案得出了这个解决方案

$str = "Hi {name}, Some text {unsubscribe|here.} some more text.";

function fix($m){
    return $m[1] . str_replace($m[2], '<a href="">', $m[2]) . $m[3] . str_replace($m[4], '</a>', $m[4]) . $m[5];
}

$result = preg_replace_callback('/(.*)(\{unsubscribe\|)(.*[^\}])(\})(.*)/', 'fix', $str);

echo str_replace('{name}', 'Firstname Lastname', $result);
$str=“你好{name},一些文本{unsubscribe |这里。}一些其他文本。”;
功能修复(百万美元){
返回$m[1]。str_replace($m[2],“”,$m[4])。$m[5];
}
$result=preg\u replace\u回调('/(.*)(\{unsubscribe\\\)(.[^\}])(\})(..*/'),'fix',$str);
echo str_replace(“{name}”,“Firstname Lastname”,“$result”);
输出:

Hi Firstname Lastname, Some text <a href="">here.</a> some more text.
Hi Firstname Lastname,一些文本还有一些文本。

那么“preg\u replace”(“/”({unsubscribe\)([a-z]*[^\}])(\})/”、“$2”、$string)有什么问题?我想把字符串的其余部分留下,因为
{unsubscribe |这里。}
将插入电子邮件正文中。有没有一种方法与此相反,将结果中的“$3”和“$1”替换为“$3”?例如,
一些文本{unsubscribe | here}如何处理更多文本。
我尝试使用您的示例,在函数中使用正则表达式捕获替换文本前后的所有字符。希望这对你有意义。我认为这已经做到了
(.*)(\{unsubscribe\)([a-z]*[^\}])(\})(.*)
谢谢@waza123,你使用
preg\u replace\u回调的回答非常有用。这让我能够锻炼我想做的事情。