Персонализирано URL маршрутизиране с PHP и регулярен израз

Опитвам се да създам много просто URL маршрутизиране и моят мисловен процес беше следният:

  • Първо проверете всички статични URL адреси
  • След това проверете URL адресите на базата данни
  • След това върнете 404, ако нито едно от тях не съществува

Разбира се, статичните URL адреси са лесни за правене, но се опитвам да намеря най-добрия начин за създаване на динамични. Бих предпочел да не се налага да задавам статичен префикс, въпреки че знам, че ще направи това много по-лесно за кодиране.

Ето какво имам в момента:

$requestURL = $_SERVER['REQUEST_URI'];

if ($requestURL == '/') {
    // do stuff for the homepage
}

elseif ($requestURL == '/register') {
    // do stuff for registration
}

// should match just "/some-unique-url-here"
elseif (preg_match("/([\/A-Za-z0-9\-]+)/",$requestURL)) { 
    // query database for that url variable
}

// should match "/some-unique-url/and-another-unique-url"
elseif (preg_match("(^\/[A-Za-z0-9\-]+\/[A-Za-z0-9\-]+)/",$requestURL)) {
    // query database for first and second variable
}

else {
    // 404 stuff
}

Проблемът ми е, че ако имам URI "/register", той ще съответства на втория оператор elseif, както и на оператора regex. Но искам да избегна необходимостта конкретно да изключвам всеки статичен URL адрес от оператора за регулярен израз, като например този:

// should match just "/some-unique-url-here"
elseif ((preg_match("/([\/A-Za-z0-9\-]+)/",$requestURL)) &&
    ($requestURL !== '/register') &&
    ($requestURL !== '/')) { 
    // query database for that url variable
}

Кой е най-лесният начин за решаване на този проблем? Вероятно ще имам около 15-20 статични URL адреса, така че конкретното изключване на всички тях би било много тромаво.


person zen    schedule 24.11.2013    source източник
comment
Странична бележка: не е необходимо да се екранира тире - в края на символен клас (или в началото). Освен това, за да предотвратите някои обърквания, можете да използвате други разделители, различни от наклонената черта /, по този начин няма да е необходимо да ги избягвате в израза си ~[/A-Za-z0-9-]+~   -  person HamZa    schedule 24.11.2013


Отговори (1)


Вашият проблем не съществува. Ако първото elseif ($requestURL == '/register') съвпада, всички следващи elseif на същото ниво няма да бъдат оценени.

Вече го правите правилно, просто се уверете, че първо сте направили сравненията на низове (==).

От друга страна, не преоткривайте колелото.

person Daniel    schedule 24.11.2013
comment
Що се отнася до използването на други рутери, вече проверих няколко от тях, но бяха твърде сложни за това, от което се нуждая. - person zen; 24.11.2013
comment
Множество причини да създадете свой собствен. Компаниите искат да видят какво можете да направите и не се интересуват много дали можете да използвате работата на някой друг. Освен това е страхотно учебно изживяване да създадете свой собствен. По този начин ще можете да разберете грешките си и може би дори да намерите начини да ускорите скрипта за вашите собствени нужди и т.н. - person NSaid; 17.02.2014
comment
Позволете ми да добавя този много мощен и лесен за управление рутер: github.com/klein/klein.php - person Dong3000; 09.05.2016