使用正则表达式从字符串返回第一个外部结果

时间:2013-07-26 09:35:43

标签: php regex string

我有以下字符串:

"{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}"

3 个答案:

答案 0 :(得分:6)

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

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

其中(?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

答案 1 :(得分:0)

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

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

使用

特别是可以使用基本的字符串操作,你可以将正则表达式提升到/^[^{]*{(.*)}[^{]*$/,这样你就可以将字符放在所需的字符串前面。同样,这可以通过字符串操作本身完成,使用substrstrrpos

答案 2 :(得分:0)

我认为您可以使用拆分功能.E然后您可以使用替换

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