2

我正在尝试捕获包含条件结尾的 URL 的中间部分:

URL 可以有两种类型:

/a/b/(part/needed)
/a/b/(part/needed)/page/#

这是我使用的正则表达式:

preg_match('@/a/b/(.*)(/page/\d)?@i', '/a/b/some/text/page/1', $matches);

返回

0=>"/a/b/some/text/page/1",
1=>"some/text/page/1"

没关系,但它包括我不想要的条件结尾!

有人能告诉我如何不包括以它结尾的条件字符串,但在最后一段存在或不存在时仍然匹配?

4

1 回答 1

3

通过锚定表达式^$并使第一组 non-greedy (.*?),您可以获得所需的段。单独是一个贪婪的.*匹配,并且会吃掉后面的所有东西.*

preg_match('@^/a/b/(.*?)(/page/\d)?$@i', '/a/b/some/text/page/1', $matches);
//-----------^-------^^^-----------^
print_r($matches);
Array
(
    [0] => /a/b/some/text/page/1
    [1] => some/text
    [2] => /page/1
)

如果您不需要/page/1,请将其设为非捕获组(?:...)

preg_match('@^/a/b/(.*?)(?:/page/\d)?$@i', '/a/b/some/text/more/page/1', $matches);
//----------------------^^^
print_r($matches);
Array
(
    [0] => /a/b/some/text/more/page/4
    [1] => some/text/more
)

regular-expressions.info有关于字符重复的很好信息+and *,以及贪婪的陷阱。

于 2013-01-01T00:09:08.053 回答