我假设你的源字符串是这样的:
{I want|I need} to make this {stupid|awesome|irritating}
sentence formatting {rapidly|quickly} and {random|spin and be random} 
否则括号是嵌套的,并且您的输出示例与您将它们放在源字符串中的方式不匹配。然后preg_match_all()像这样使用:
preg_match_all("/{.*}/U",$sourceString, $result, 
                      PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);
这对你$sourceString来说会产生:
array(1) {
  [0]=>
  array(4) {
    [0]=>
    array(2) {
      [0]=>
      string(15) "{I want|I need}"
      [1]=>
      int(0)
    }
    [1]=>
    array(2) {
      [0]=>
      string(27) "{stupid|awesome|irritating}"
      [1]=>
      int(29)
    }
    [2]=>
    array(2) {
      [0]=>
      string(17) "{rapidly|quickly}"
      [1]=>
      int(77)
    }
    [3]=>
    array(2) {
      [0]=>
      string(27) "{random|spin and be random}"
      [1]=>
      int(99)
    }
  }
}
你得到所有的物品。然后你可以处理每个条目,去掉“{”和“}”,explode()在“|”上 获得一系列可供选择的选项。然后你选择你想要的并用它替换以前找到的项目。请注意,我捕获了找到匹配模式的偏移量,因为您最终不能这样做,str_replace()因为我假设您希望能够在许多地方使用相同的条目(即“{this|that} foo {this|that}” str_replace()。替换两者,而我认为这是不需要的。所以我们在字符串中得到了偏移量,可以轻松计算字符串的长度,但这足以进行一些手术,并切断我们的条目并进行替换。其他更清洁的方法是使用preg_replace_callback()并把所有的“逻辑”