Я работаю над маршрутизацией или uri в моем приложении PHP. В настоящее время у меня есть массив с regex => url map, подобный этому …
<?php $uri_routes = array( //users/account like http://mysite.com/users/324 (any digit) 'users/friends/page-(\d+)' => 'modules/users/friends/page-$1', 'users/friends/' => 'modules/users/friends/', 'users/online' => 'modules/users/online/' , 'users/online/page-(\d+)' => 'modules/users/online/page-$1', 'users/create' => 'modules/users/create', 'users/settings' => 'modules/users/settings', 'users/logout(\d+)' => 'modules/users/logout', 'users/login' => 'modules/users/login', 'users/home' => 'modules/users/home', //forums 'forums/' => 'modules/forums/index', 'forums/viewthread/(\d+)' => 'modules/forums/viewthread/$1', 'forums/viewforum/(\d+)' => 'modules/forums/viewforum/$1', 'forums/viewthread/(\d+)/page-(\d+)' => 'modules/forums/viewthread/$1/page-$2', 'forums/viewforum/(\d+)/page-(\d+)' => 'modules/forums/viewforum/$1/page-$2' //blog routes coming soon //mail message routes coming soon //various other routes coming soon ); ?>
Затем я могу выполнить цикл в моем массиве карт $ uri_routes и сопоставить uri с preg_match () следующим образом …
<?php //get url from URL $uri = isset($_GET['uri']) ? $_GET['uri'] : null; //runs our function and returns an array // $uri['module'] this will be the class/module/section // $uri['method'] this will be the page in that section or method in that class // $uri['urifragments'] this will either page a user ID, or an item ID or a page number for paging $uri = get_route($_GET['uri'],$uri_routes); function get_route($uri,$uri_routes) { foreach($uri_routes as $rUri => $rRoute) { if(preg_match("#^{$rUri}$#Ui",$uri)) { $uri = preg_replace("#^{$rUri}$#Ui",$rRoute,$uri); break; } } $uri = explode('/',$uri); $return['module'] = $uri['1']; $return['method'] = $uri['2']; $return['urifragments'] = $uri['3']; $return['urifragments2'] = $uri['4']; return $return; }
Я открыт для предложения улучшить это в любом случае. Прямо сейчас я застреваю, так как есть 4 возможных значения / значения массива. Если ключ массива 3 или ключ 4 содержит слово «страница-», за которым следует число, я хотел бы присвоить его переменной $ page. Но если ключ 3 или ключ 4 содержит только число без слова «page-», я могу предположить, что это идентификатор пользователя, идентификатор блога, идентификатор форума и т. Д. И присваивает ему переменную $ id.
Если вы знаете хороший подход к этому, пожалуйста, помогите.
ОБНОВИТЬ
для упрощения вещей, помимо наличия «страницы» перед номерами страниц, я мог бы иметь «id-» перед номерами идентификаторов
Вместо того, чтобы использовать $1
и $2
для соответствия нашим маршрутам, попробуйте использовать именованные записи.
5.2.2 Именованные подшаблоны теперь принимают синтаксис (?) И (? 'Name'), а также (? P). Предыдущие версии принимаются только (? P). Источник: preg_match
Также, когда вы делаете preg_replace, вы используете \ [0-99], где \ 0 – целая строка и от 1 до 99 совпадают.
Но если вы собираетесь использовать именованные захваты, вы можете назначить массив параметру $replacement
с захватом имени (например, если вы запишете ?P<page>
тогда вы передадите array('page'=>"new value of page")
).
Надеюсь, это поможет.