PHP и Apache - анализировать URL-адрес mod_rewrite - PullRequest
2 голосов
/ 06 февраля 2010

У меня есть сервер apache, настроенный на перенаправление каждого запроса в index.php, чтобы я мог использовать 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 позже в коде, чего я бы хотел избежать. Если нет совпадения с URI, немедленно перенаправьте страницу на страницу 404 и прервите операцию. Не знаю, ясно ли я прояснил ..

Ответы [ 3 ]

3 голосов
/ 06 февраля 2010

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

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

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

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

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

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

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


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

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

1 голос
/ 06 февраля 2010

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

$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"
}

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

1 голос
/ 06 февраля 2010

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

...