Возьмем, к примеру, следующее регулярное выражение.
preg_match('!^publisher/([A-Za-z0-9\-\_]+)/([0-9]+)/([0-9]{4})-(january|february|march|april|may|june|july|august|september|october|november|december):([0-9]{1,2})-([0-9]{1,2})/([A-Za-z0-9\-\_]+)/([0-9]+)(/page-[0-9]+)?$!', 'publisher/news/1/2010-march:03-23/test_title/1/page-1', $matches);
print_r($matches);
Производит следующее:
Array
(
[0] => publisher/news/1/2010-march:03-23/test_title/1/page-1
[1] => news
[2] => 1
[3] => 2010
[4] => march
[5] => 03
[6] => 23
[7] => test_title
[8] => 1
[9] => /page-1
)
Однако, поскольку последнее совпадение является необязательным, оно также может работать с соответствием следующему "publisher / news / 1/2010-march: 03-23 / test_title / 1". Моя проблема в том, что я хочу иметь возможность сопоставлять (/ page- [0-9] +), если он существует, но сопоставлять только номер страницы, поэтому "publisher / news / 1/2010-march: 03-23 / test_title / 1 / page-1 "будет выглядеть так:
Array
(
[0] => publisher/news/1/2010-march:03-23/test_title/1/page-1
[1] => news
[2] => 1
[3] => 2010
[4] => march
[5] => 03
[6] => 23
[7] => test_title
[8] => 1
[9] => 1
)
Я пробовал следующее регулярное выражение
'!^publisher/([A-Za-z0-9\-\_]+)/([0-9]+)/([0-9]{4})-(january|february|march|april|may|june|july|august|september|october|november|december):([0-9]{1,2})-([0-9]{1,2})/([A-Za-z0-9\-\_]+)/([0-9]+)/?p?a?g?e?-?([0-9]+)?$!'
Это работает, однако также будет соответствовать "publisher / news / 1/2010-march: 03-23 / test_title / 1/1". Я понятия не имею, чтобы выполнить матч, но не вернулся ли он в матчах? Возможно ли это в одном регулярном выражении?