2010-02-06 5 views
2

У меня есть апач моего сервера настроены для перенаправления каждого запроса в index.php, так что я могу использовать URLs как:PHP и Apache - синтаксический mod_rewrite URL

http://www.website.com/about/us 

Теперь мне нужно разобрать URL, чтобы определить, существует ли каждый маршрут и что ожидать от него, поэтому я могу настроить таблицу базы данных для сохранения маршрутов, и поэтому мои клиенты могут редактировать свои маршруты по своему усмотрению. Дело в том, что я пока не могу разобрать парсинг.

Вот мой код:

$uri = 'about/us'; 
$regex = '(page(/<action>))'; 
if (! preg_match($regex, $uri, $matches)) { 
    echo 'the route doesn\'t match'; 
    exit(); 
} 

Он всегда появляется, что эхо-сообщения. Что я делаю не так?

редактировать:

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

/user/yoda 

Регулярное выражение здесь будет полезно разобрать первый аргумент в качестве действия или страницы, а второй как ключ, который позволит только определенный набор символов, например, если Я хочу ожидать, что в этом случае второй параграф только соответствует «_-azAZ09», что-то вроде этого. Другими словами, набор выражений регулярных выражений будет меня по сравнению с ури, чтобы определить, соответствует ли кто-либо из них uri, и определить действие, которое нужно предпринять из этого. Использование функции «Взрыв» заставит меня оценить сегменты uri позже в коде, который я бы хотел избежать. Если совпадение с uri несовместимо, немедленно переместите страницу на 404 и выполните операцию. Не знаю, ясно ли я.

ответ

3

Вместо использования регулярных выражений, почему бы просто не разбить входящий URI?

$uri = 'about/us'; 
list($page, $action) = explode('/', $uri); 

Если вам нужно больше, чем два, просто удалите список:

$pagePath = explode('/', $uri); 

Но, если вы настаивают на использовании регулярных выражений, это будет делать:

$regex = '#(?P<page>.*)/(?P<action>.*)#'; 

Однако , он не предлагает вам ничего особенного, кроме того, что $ matches теперь будет содержать $matches['page'] и $matches['action'] - но если вам это действительно нужно, вы можете использовать list(), как показано выше.


Использование функции взрываются бы мне оценить Ури сегменты позже код, которым я хотел бы избежать

Вместо того, чтобы убедиться, что страница является действительным на это набор символов, почему бы не скомпилировать список правильной таблицы поиска страниц и просто использовать php's in_array, который намного быстрее, чем регулярное выражение? Извлечение сегментов URL в массив позволит вам получить многомерные массивы, которые будут проверены в кратчайшие сроки.

+0

Это будет работать, если ситуация всегда будет легкой, но это не так. Поэтому мне действительно нужно использовать регулярные выражения. – yoda

+0

Помогите объяснить почему? URL всегда будет иметь ''/''s, и это кажется подходящим решением. Я не понимаю, почему необходимы регулярные выражения для ручного разделения URL-адреса. Может быть, вопрос отсутствует? – LiraNuna

+0

+1 regex стоит дорого! – sepehr

1

Я думаю, что регулярное выражение должно быть окружено символом; например '@(page(/<action>))@'.Смотрите примеры в http://php.net/preg_match

1

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

$uri = 'about/us'; 
$regex = '~(?<path>[^/]+)/(?<action>.+)~'; 
var_dump($matches); 

Какие выходы:

array(5) { 
    [0]=> 
    string(8) "about/us" 
    ["path"]=> 
    string(5) "about" 
    [1]=> 
    string(5) "about" 
    ["action"]=> 
    string(2) "us" 
    [2]=> 
    string(2) "us" 
} 

Однако это будет работать только тогда, когда компонент путь только идет вниз на один уровень!

Смежные вопросы