我有一个字符串: / foo / {bar} / {baz?}
现在我要提取{...}中的所有单词。 但是关于"?"我不仅要选择{...},还要选择" /"之前" {"
到目前为止我得到了这个:
$string = '/foo/{bar}/{baz?}';
preg_match_all('~{(\w+)[?]?}~', $string, $matches);
print_r($matches);
结果:
Array
(
[0] => Array
(
[0] => {bar}
[1] => {baz?}
)
[1] => Array
(
[0] => bar
[1] => baz
)
)
但应该是:
Array
(
[0] => Array
(
[0] => {bar}
[1] => /{baz?}
)
[1] => Array
(
[0] => bar
[1] => baz
)
)
(注意{baz?}匹配之前/之前)
希望这很清楚,我的英语不太好。 感谢
答案 0 :(得分:6)
使用内部有2个捕获组的branch reset group((?|...|...)
)将共享相同的ID:
/(?|\/{(\w+)\?}|{(\w+)})/
请参阅regex demo
<强>详情:
(?|
- 分支重置组启动\/{(\w+)\?}
- 一个/{
,然后是1个字的字符(捕获到第1组),然后是?}
|
- 或{(\w+)})
- {
后跟1个字的字符(再次捕获到第1组),然后是}
。$re = '/(?|\/{(\w+)\?}|{(\w+)})/';
$str = '/foo/{bar}/{baz?}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r($matches);