我有以下字符串:
"{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}"
答案 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);
特别是可以使用基本的字符串操作,你可以将正则表达式提升到/^[^{]*{(.*)}[^{]*$/
,这样你就可以将字符放在所需的字符串前面。同样,这可以通过字符串操作本身完成,使用substr
和strrpos
。
答案 2 :(得分:0)
我认为您可以使用拆分功能.E然后您可以使用替换。