isteğe bağlı bir dize maç preg_match'in, ama dize tüm eşleşmiyor

3 Cevap php

Örneğin aşağıdaki düzenli ifade maçı al.

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);

Aşağıdaki üretir:

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
)

Son maç isteğe bağlı olarak, ancak o da şu "publisher/news/1/2010-march :03-23 ​​/ test_title / 1" ile eşleşen çalışabilirsiniz. Benim sorunum, eğer varsa (/ sayfa-[0-9] +) maç edebilmek olmak istiyorum olduğunu, ancak maçı sadece sayfa numarası yani "publisher/news/1/2010-march :03-23 ​​/ test_title / 1/page-1 "şöyle maç olacaktır:

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
)

Ben aşağıdaki regex denedim

'!^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]+)?$!'

Bu çalışır, ancak aynı zamanda "publisher/news/1/2010-march :03-23 ​​/ test_title/1/1" maç olacak. Ben bir maç yapmak için hiçbir fikrim yok ama geri maçlarda gelmek yok? Tek bir regex mümkün mü?

3 Cevap

Kesinlikle uyuşmuyor için 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]+))?$!

Hala publisher/news/1/2010-march:03-23/test_title/1/whatever maç ama gözardı etmek /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]+))|/.*)?$!

belki de böyle:

'!^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]+))?$!'

Bu sizin için ne arıyorsanız regex olduğunu:

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

Siz rexexbuddy bunu test edebilirsiniz. "Sayfa-1" Başka boş VAR 9 bırakacak ayarlı değilse onu koyacaktır.