Prenons par exemple la correspondance regex suivante.preg_match pour faire correspondre une chaîne optionnelle, mais ne correspond pas à la totalité de la chaîne
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);
Il produit les éléments suivants:
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
)
Cependant, comme le dernier match est en option, il peut également fonctionner avec les éléments suivants correspondant à « éditeur/nouvelles/1/2010-mars: 03-23 / test_title /1". Mon problème est que je veux être capable de faire correspondre (/ page- [0-9] +) si elle existe, mais ne correspond qu'au numéro de page de sorte que "publisher/news/1/2010-mars: 03-23 / test_title/1/Page-1" correspond comme ceci:
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
)
J'ai essayé le regex suivant
'!^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]+)?$!'
Cela fonctionne, mais il correspondra aussi « éditeur/nouvelles/1/2010-mars : 03-23 / test_title/1/1 ". Je n'ai aucune idée d'effectuer un match mais de ne pas le faire revenir dans les matchs? Est-ce possible dans une seule regex?
C'est le ticket. Merci. Est-ce que?: Signifie match seulement s'il existe? – buggedcom
?: Rend les parenthèses "non-capturantes". Ainsi, dans le tableau de votre exemple, 0 correspond à la chaîne entière correspondant à votre modèle. 1-9 sont des "captures", tout ce que vous avez enveloppé() dans votre modèle. (?:) regroupe la "/ page" et la "[0-9] +" ensemble, mais ne les "capture" pas. –
Ah k à la vôtre. Désolé je ne peux pas voter, je n'ai pas encore mon représentant +15 – buggedcom