Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式_Php_Regex - Fatal编程技术网

Php 正则表达式

Php 正则表达式,php,regex,Php,Regex,我有一个字符串:/foo/{bar}/{baz?} 现在我想提取{…}中的所有单词。 但是在带“?”的单词上,我不仅要选择{…},还要选择“{”之前的“/” 到目前为止,我得到了这个: $string = '/foo/{bar}/{baz?}'; preg_match_all('~{(\w+)[?]?}~', $string, $matches); print_r($matches); 结果: Array ( [0] => Array (

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

希望这足够清楚我的英语不是很好。 谢谢

使用一个(
(?|…|…)
),其中包含两个共享相同ID的捕获组:

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

详细信息

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


@JeffHuijsmans如果一个模式是正则的,正则表达式将能够匹配它。这个模式看起来是正则的,所以很好。有关路由系统im,请参阅@JeffHuijsmans itsbuilding@Halcyon谢谢你纠正我!我将删除相应的注释。PHP是一种成熟的编程语言,为什么不使用PHP的if/else而不是尝试让正则表达式做一些它不太适合做的事情?除此之外,PHP比正则表达式更具表现力,因此在将来查看代码时更容易了解它试图做什么。此正则表达式可能会有所帮助:
~(((/{[^}]*\?}){[^}]*}~
,尽管它很难阅读。有一个外行定义“或”
(this | that)
。“This”是以/开头并包含{smth?}
(/{[^}]*\?})
的内容的捕获组。
[^}]*
部分将匹配所有内容,直到下一个右括号结束。而“that”捕获组不包含问号,因此与斜杠不匹配(或者如果您只想匹配曲括号之前的任何字符,请将斜杠切换为点)。
$re = '/(?|\/{(\w+)\?}|{(\w+)})/';
$str = '/foo/{bar}/{baz?}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
print_r($matches);