Php 查找大括号内的文本并替换包含大括号的文本

Php 查找大括号内的文本并替换包含大括号的文本,php,regex,preg-replace-callback,Php,Regex,Preg Replace Callback,我想找到一个模式{text}并替换包含花括号的文本 $data = 'you will have a {text and text} in such a format to do {code and code}'; $data= preg_replace_callback('/(?<={{)[^}]*(?=}})/', array($this, 'special_functions'),$data); 预期产出 您将有一个这样格式的记事本来执行PHP 如何在使用regex的php中使用p

我想找到一个模式
{text}
并替换包含花括号的文本

$data = 'you will have a {text and text} in such a format to do {code and code}';
$data= preg_replace_callback('/(?<={{)[^}]*(?=}})/', array($this, 'special_functions'),$data);
预期产出

您将有一个这样格式的记事本来执行PHP


如何在使用regex的php中使用
preg\u replace\u callback
同时替换文本和大括号?您需要如下编辑模式:

$data = preg_replace_callback('/{{([^{}]*)}}/', array($this, 'special_functions'), $data);
{([^{}]*)}
模式将匹配:

  • {{
    -
    {{{
    子字符串
  • ([^{}]*)
    -第1组:除
    {
    }
  • }
    -a
    }
    文本
然后,在
特殊功能
功能内,将
开关($occurances[0])
替换为
开关($occurances[1])
$occurrences[1]
是用
([^{}]*)
模式捕获的文本部分。由于整个匹配是
{…}
,捕获的是
..
,因此
..
用于检查开关块中可能出现的情况,大括号将在使用后被删除(=添加到由于
preg\u replace\u回调
函数而被替换的匹配值中)


请参阅。

如果您有如此复杂的regexp,您可能需要查看:


在问题中添加
特殊函数
代码,并提供预期结果。预期结果是什么?@revo更新了我的答案question@WiktorStribiżew我已将该功能添加到我的问题中。请参见下面的答案,它一定对您有用。如果没有,请提供一个更新的PHP提琴来显示问题。这是有效的。我有一个疑问$occurances[0]包含带大括号的文本,$occurances[1]包含不带大括号的文本。所以从逻辑上讲,$occurances[0]应该同时替换文本和大括号?@Shadow
$occurances[0]
不会替换任何内容。这是与
preg\u replace\u callback
函数匹配的文本,因此它是将被替换的文本。我已向上投票。同样,索引[1]中的内容也将被替换。是吗?@Shadow是的,但是当
{{…}
中的文本包含
{
}
时,
[^{}]*
阻止任何匹配。如果你需要它们,用
*?
@Shadow替换
[^{}]*
,这没那么重要,从模式中删除一个
{
}
'/{([^{}]*])}/'
,当然,没有火箭科学:)
$data = preg_replace_callback('/{{([^{}]*)}}/', array($this, 'special_functions'), $data);
$data = 'you will have a {text and text} in such a format to do {code and code}';

pattern('{{([^{}]*)}}')
  ->replace($data)
  ->first()
  ->callback(function (Match $match) {
      switch ($match->group(1)) {
          case 'text and text':
              return 'NOTEPAD';

          case 'code and code':
              return 'PHP';

          default:
              return '';
      }
  });