Посмотрите на тот вариант, который предоставляется в Symfony/Routing (не столько реализация, сколько вообще как определяются рауты) и попробуйте реализовать по схожему принципу.
По сути, все сводится к формированию регулярного выражения из правила. Например правило вида
route="/blog/{id}" requirements={id: '\d+'}
где route - это шаблон нашего урла, а requirements - валидация параметров (опционально)
сгенерит регулярку вида:
^/blog/(?P<id>\d+)$
где
(?P<id>\d+)
именованный подшаблон (можно сделать и проще, но так удобнее). С версии 5,2+ могут быть такие варианты:
(?P<id>\d+)
(?<id>\d+)
(?'id'\d+)
Далее ваш маршрутизатор при проверке соответствий с маршрутами просто проходит по массиву правил (по сути массиву регулярок) и смотрит соответствует ли оно какому-либо правилу.
На самом деле в целях обучения, это самый классный способ. Ибо там есть где подумать и над формированием новой строки, и с регулярками разобраться можно неслабо... Последнее поможет вам не только в PHP, но и в JS (немного), и просто в жизни (кучи IDE и редакторов имеют поиск и замену по регуляркам, что иногда очень полезно).
Схожая реализация в Yii, и в большинстве других фреймворков.