如果组存在,如何捕获组,如果不存在,则匹配正则表达式的其余部分?

时间:2016-08-25 10:20:49

标签: php regex pcre

我有以下pcre正则表达式:

^(.+\/.*\.php)(\?)?(\/.+)$

此示例网址:

/subdir/file.php/this/is/a/path/info?par=am1&param=2

正则表达式首先在#1组/subdir/file.php和#2组中写入捕获/ this /是/ a / path / info?par = am1& param = 2.

我需要将第4组分成参数(在?之后)。并获得以下内容:

组#1:/subdir/file.php 组#3:/ this /是/ a / path / info 第4组:?par = am1& param = 2

有时,网址没有参数。在这种情况下,我只需要匹配#1和#2组。

我试过这个:

^(.+\/.*\.php)(\?)?(\/.+)(\?.*)$

但是如果URL没有参数,则它与#1和#3组(/subdir/file.php和/ this / is / a / path / info)不匹配。 / p>

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用urlparsepreg_split来分割获得的路径:

$url = "/subdir/file.php/this/is/a/path/info?par=am1&param=2";
$pth = parse_url($url, PHP_URL_PATH);
$chunks = preg_split('~(?<=\.php)(?=/)~', $pth);
foreach ($chunks as $chunk) {
    echo $chunk . "\n"; // =>  /subdir/file.php and  /this/is/a/path/info
}
echo parse_url($url, PHP_URL_QUERY) . "\n"; // => par=am1&param=2

请参阅PHP demo

请注意,使用preg_split('~(?<=\.php)(?=/)~', $pth),最终会得到尽可能多的some.php块,因为路径中有这样的块。 (?<=\.php)(?=/)模式匹配.php/子字符串之间的空位置。