2016-08-25 107 views
1

我有以下PCRE正则表达式:如何捕获一个组,如果不存在,则匹配其余的正则表达式?

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

而这个示例URL:

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

正则表达式中的#1组/subdir/file.php和#2组中previosuly写入捕获/ this/is/a/path/info?par = am1 & param = 2。

我需要分成第四组参数(在?之后)。并得到如下:

组#1:/subdir/file.php 组#3:/这/是/一个/路径/信息 第4组:PAR = AM1 & PARAM = 2

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

我已经试过这样:

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

但如果URL没有参数,它不匹配的#1和#3组(/subdir/file.php和/本/是/一个/路径/信息)。

我该怎么做?

谢谢!

+3

'parse_url'会比复杂的正则表达式更好 – anubhava

+0

@anubhava我写过正则表达式,因为'parse_url'在PATH参数上返回/subdir/test.php/this/is/a/path/info,而我需要/这个/是/一个/路径/信息 –

+0

你为什么不结合他们?使用'parse_url',然后将你的正则表达式应用到PATH参数。 –

回答

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/子串之间的空位置。

+1

不错的解决方案!这比我复杂的正则表达式更简单。谢谢! –

相关问题