Отрицание в регулярном выражении

28.10.2009 23:07 / Николай Рыков / 1085 просмотров / ...

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

/news/some-long-and-detailed-shortcut-for-news-item/
/news/some-long-and-detailed-shortcut-for-news-item

Но не подходили следующие:

/news/page-2/
/news/delete/42/
/news/edit/42/
/news/add/
/news/add

Часть адреса some-long-and-detailed-shortcut-for-news-item желательно получить в виде отдельной строки и без слеша вне зависимости от того, указан ли он в адресе.

Для решения задачи необходимо воспользоваться т.н. negative lookahead:

^\/news\/((?!(edit\/|delete\/|add\/|add$|page-\d+\/))(.+?)\/?)$