Регулярное выражение, необязательное совпадение в URL

Я трачу пару часов без хорошего результата (может быть, мое настроение не помогает об этом).

Я пытаюсь создать регулярное выражение, чтобы помочь мне сопоставить оба URL-адреса:

/reservables/imagenes/4/editar/6
/reservables/imagenes/4/subir

Как вы заметили выше, последний сегмент в первом URL-адресе 6 отсутствует в конце второго URL-адреса, потому что эти сегменты здесь необязательны. Поэтому мне нужно сопоставить оба URL-адреса в одном регулярном выражении, для этого я пробовал это:

reservables/(editar|imagenes)/([0-9]+)/(imagen|editar|actualizar|subir)/([0-9]+)

Это отлично работает только для первого URL. Итак, прочитав несколько заметок о регулярных выражениях, я понял, что мне нужен символ ?, верно? Итак, я попробовал это, но это не сработало:

reservables/(editar|imagenes)/([0-9]+)/(imagen|editar|actualizar|subir)/([0-9]+)?

Ну я не чего не так делаю.


person manix    schedule 02.04.2013    source источник


Ответы (2)


Вы также хотите поместить ? вокруг /, например:

reservables/(editar|imagenes)/([0-9]+)/(imagen|editar|actualizar|subir)(?:/([0-9]+))?

Вы можете видеть, что он правильно соответствует debuggex.

person Sergiu Toarca    schedule 02.04.2013
comment
Ну отлично работает. Только один вопрос, почему вы ставите ?: в начале необязательного сегмента? это работает как условное? - person manix; 02.04.2013
comment
Если ?: добавляется сразу после скобки, это означает Не захватывать то, что находится внутри этой группы. Я полагал, что вас не волнует /, а интересует только число. - person Sergiu Toarca; 02.04.2013
comment
Да! / не был включен. Большое спасибо :) - person manix; 02.04.2013

Этот будет работать:

reservables/(editar|imagenes)/([0-9]+)/(imagen|editar|actualizar|subir)/([0-9]*)
person Wouter J    schedule 02.04.2013
comment
через пару минут перепроверю и дам совет - person manix; 02.04.2013
comment
Ну, я протестировал его с помощью тестера регулярных выражений, и он не соответствует обоим URL-адресам. - person manix; 02.04.2013