正则表达式如果还有

时间:2017-04-21 13:03:53

标签: php regex

我有一个字符串: / 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?}匹配之前/之前)

希望这很清楚,我的英语不太好。 感谢

1 个答案:

答案 0 :(得分:6)

使用内部有2个捕获组的branch reset group(?|...|...))将共享相同的ID:

/(?|\/{(\w+)\?}|{(\w+)})/

请参阅regex demo

<强>详情:

  • (?| - 分支重置组启动
  • \/{(\w+)\?} - 一个/{,然后是1个字的字符(捕获到第1组),然后是?}
  • | - 或
  • {(\w+)}) - {后跟1个字的字符(再次捕获到第1组),然后是}

PHP demo

$re = '/(?|\/{(\w+)\?}|{(\w+)})/';
$str = '/foo/{bar}/{baz?}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r($matches);