preg_match для соответствия необязательной строке, но не для всей строки - PullRequest
1 голос
/ 25 марта 2010

Возьмем, к примеру, следующее регулярное выражение.

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". Я понятия не имею, чтобы выполнить матч, но не вернулся ли он в матчах? Возможно ли это в одном регулярном выражении?

Ответы [ 3 ]

2 голосов
/ 25 марта 2010

Чтобы абсолютно не совпадать publisher/news/1/2010-march:03-23/test_title/1/whatever

!^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/whatever, но игнорировать /whatever:

!^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]+))|/.*)?$!
0 голосов
/ 25 марта 2010

Это регулярное выражение, что вы ищете:

^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-(\d+))?

Вы можете проверить это в rexexbuddy. Если «page-1» не задано, то оставит var 9 пустым, иначе будет установлено.

0 голосов
/ 25 марта 2010

может быть так:

'!^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]+))?$!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...