我有以下字符串:
"{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}"
您可以使用此模式从不确定级别数的嵌套括号中提取最外部的内容:
$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
我认为你可以使用split Function.E 然后你可以使用Replace。
/^{(.*)}$/
将删除第一个和最后{
一个}
通过使用$var = preg_replace('/^{(.*)}$/', '$1', $your_text);
这也可以通过基本的字符串操作来实现,您可以推进那个正则表达式/^[^{]*{(.*)}[^{]*$/
,让您将字符放在所需字符串的前面和后面。同样,这可以通过字符串操作本身来完成,使用substr
and strrpos
。