serejatoje
@serejatoje

Как вытащить все слова из адресной строки с помощью preg_match?

Всем привет! Возникла вот такая задача - вытащить все параметры из адресной строки, разделенные слешем. Вытащить все это в массив. Например: mysite.ru/param1/param2/param3/param4/../param999. У меня есть кусок кода:
$term = '([a-z/]+)';
preg_match('@^' . $term . '$@Uu', $uri, $match);

Сколько не пробовал прописывать $term - не выходит у меня сгрупировать слова. Получается только одна группа, которая содержит слова вместе со слешами. Я конечно могу разбить всё это через explode, но думаю, что можно и регуляркой. И да, нужно чтобы замыкали регулярку @^ и $, как в примере..

<?php
$GLOBALS['sitemap'] = array(
    '_404' => 'page404.php',
    '/' => 'mainpage.php',
    '/ads(/[a-z/]+)' => 'adspage.php',
    '/news[/]?' => 'newspage.php',
    '/(login|signup)[/]?' => 'userspage.php',
    '/users(/(companies|experts))?[/]?' => 'userspage.php',
    '/about(/(feedback|advertising|license|logos))?[/]?' => 'aboutpage.php',
    '/[a-z0-9-]+' => 'personalpage.php'
);

class route
{
    public $params = null;
    public $classname = '';
    public $data = null;
    public $request_uri = '';
    public $url_info = array();
    public $found = false;

    function __construct()
    {
        $this->mapClassName();
    }

    function mapClassName()
    {
        $this->classname = '';
        $this->params = null;
        $map = &$GLOBALS['sitemap'];
        $this->request_uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $this->url_info = parse_url($this->request_uri);
        $uri = urldecode($this->url_info['path']);
        $data = false;
        foreach ($map as $term => $dd) {
            $match = array();
            $i = preg_match('@' . $term . '$@Uu', $uri, $match);
            if ($i > 0) {
                $m = explode(',', $dd);
                $data = array(
                    'classname' => isset($m[0]) ? strtolower(trim($m[0])) : '',
                    'params' => $match,
                );
                break;
            }
        }
        if ($data === false) {
            if (isset($map['_404'])) {
                $dd = $map['_404'];
                $m = explode(',', $dd);
                $this->classname = strtolower(trim($m[0]));
                $this->params = array();
            }
            $this->found = false;
        } else {
            $this->classname = $data['classname'];
            $this->params = $data['params'];
            $this->found = true;
        }
        return $this->classname;
    }
}

Скажите, всё это плохо? А то я уже подумываю, как бы ВООБЩЕ избавиться от регулярок.. тем более в роутере.. почитал, что они висяки дают, и что можно сделать через эксплоуд..
  • Вопрос задан
  • 2816 просмотров
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Я конечно могу разбить всё это через explode, но думаю, что можно и регуляркой.

Русурсы лишние простаивают, решили их делом занять?
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Для "всех" используйте preg_match_all
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы