1

我有以下字符串:

"{My {formatted {hi|hello}|formate{hi|hello} }  {option 1|option 2|option 3}}";

我想在“{”和“}”括号之间找到结果。

结果也应该来自外层,而不是{hi|hello}

"My {formatted {hi|hello}|formate{hi|hello} }  {option 1|option 2|option 3}"
4

3 回答 3

6

您可以使用此模式从不确定级别数的嵌套括号中提取最外部的内容:

$pattern = '~{((?>[^{}]++|(?R))+)}~';

where(?R)表示重复整个模式。这是一种递归方法。
如果您需要在更大的表达式中使用相同的子模式,则必须使用:
({((?>[^{}]++|(?-2))+)})因为(?-2)是对左侧第二个捕获组(此处为第一个)的相对引用。

图案细节:

 (             # first capturing group
   {           # literal {
   (           # second capturing group (what you are looking for)
     (?>       # atomic group
       [^{}]++ # all characters except { and }, one or more time
      |        # OR
       (?-2)   # repeat the first capturing group (second on the left)
     )+        # close the atomic group, repeated 1 or more time
   )           # close the second capturing group
   }           # literal }
 )             # close the first capturing group
于 2013-07-26T12:59:50.883 回答
0

我认为你可以使用split Function.E 然后你可以使用Replace

http://php.net/manual/pt_BR/function.split.php

于 2013-07-26T09:50:12.313 回答
0

/^{(.*)}$/将删除第一个和最后{一个}

通过使用$var = preg_replace('/^{(.*)}$/', '$1', $your_text);

这也可以通过基本的字符串操作来实现,您可以推进那个正则表达式/^[^{]*{(.*)}[^{]*$/,让您将字符放在所需字符串的前面和后面。同样,这可以通过字符串操作本身来完成,使用substrand strrpos

于 2013-07-26T09:45:14.747 回答