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

Find text inside curly braces and replace text including curly braces

我想找到一个模式 {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);

和我的 special function 包含回调代码来替换大括号和完全有条件的文本。

public function special_functions($occurances){
        $replace_html = '';
        if($occurances){
            switch ($occurances[0]) {
                case 'text and text':
                    $replace_html = 'NOTEPAD';
                    break;
                case 'code and code':
                    $replace_html = 'PHP';
                    break;

                default:
                    $replace_html ='';
                    break;
            }
        }
        return $replace_html;
    }

预期输出

you will have a NOTEPAD in such a format to do PHP

如何使用正则表达式

在 php 中使用 preg_replace_callback 同时替换文本和花括号

您需要像这样编辑模式:

$data = preg_replace_callback('/{{([^{}]*)}}/', array($this, 'special_functions'), $data);

{{([^{}]*)}} 模式将匹配:

  • {{ - {{ 子字符串
  • ([^{}]*) - 第 1 组:除 {}
  • 之外的任何 0+ 个字符
  • }} - }} 文本

然后,在 special_functions 函数内,将 switch ($occurances[0]) 替换为 switch ($occurances[1])$occurrances[1] 是使用 ([^{}]*) 模式捕获的文本部分。由于整个匹配是 {{...}} 而捕获的是 ...,因此 ... 用于检查 switch 块中的可能情况,并且大括号将被删除,因为它们是 consumed(=添加到作为 preg_replace_callback 函数结果替换的匹配值)。

参见PHP demo

如果你有这么复杂的正则表达式,你可能想看看 T-Regx:

$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 '';
      }
  });