Saya telah mencoba membuat regex untuk mencocokkan bagian tertentu dari jalur URL, namun harus diakui dengan sedikit pengalaman regex sebelumnya dan setelah membaca berbagai tutorial regex selama beberapa jam, saya sepertinya terjebak. Kesalahan saya mungkin sesuatu yang sangat sederhana pada saat ini, tetapi saya bahkan tidak yakin apa yang harus dicari dan jenis operator regex apa yang saya butuhkan (saya melihat banyak pertanyaan lain, dan sementara beberapa serupa, saya tidak melakukannya 'tidak menemukan kecocokan yang tepat).

Saya harus mencocokkan jalur URL apa pun di bawah ini:

/layanan
/layanan/
/layanan/halaman/2
/services/page/140/

Tapi itu tidak boleh cocok dengan salah satu di bawah ini:

/layanan/halaman
/servicesx/page
/layanan/halaman
/layanan/halaman/
/layanan/halaman
/layanan/halaman/2/
/layanan/foo
/services/foo/page

Saya harus mencocokkan garis miring / diikuti oleh "layanan", opsional diikuti oleh garis miring dan kemudian mengikuti persis dengan halaman dan garis miring dan sejumlah digit dan garis miring opsional atau jika tidak diikuti dengan tepat itu, maka tidak ada lagi yang harus mengikuti.

Nomor harus selalu mengikuti "halaman", jika tidak, "halaman" yang mengikuti "layanan" tanpa nomor juga tidak valid, dan tidak ada hal lain yang harus mengikuti "layanan".

Saya telah menggunakan alat ini untuk bereksperimen: https://regex101.com/

Sejauh ini saya telah menemukan regex ini, yang tidak berfungsi karena masih terlalu cocok (cocok dengan "/ services/").

\/\bservices\b\/?(?:page\/[0-9]+)?\/?

Saya harus menggunakan regex di PHP, jika itu penting.

regex matching too much

0
senectus 2 Juli 2020, 03:26

1 menjawab

Jawaban Terbaik

Regex Anda tidak memiliki jangkar awal dan akhir string, itulah sebabnya ia cocok dengan /services/ di URL yang tidak ingin Anda cocokkan. Selain itu, Anda tidak memerlukan pernyataan \b di dalamnya, karena / sebelum dan sesudah services menyiratkan bahwa \b akan benar. Terakhir, jika Anda mengubah pembatas (mis. ke ~), Anda tidak perlu keluar dari garis miring di regex. Ini akan melakukan apa yang Anda inginkan:

^/services/?(?:page/[0-9]+)?/?$

Demo di regex101

1
Nick 2 Juli 2020, 00:53