Дополнительные проверки в конструкциях switch/case по регулярным выражениям

Оператор switch в своих секциях case использует лишь нестрогое сравнение == переменных. Но как быть, если в секции нужно получить результат от работы регулярки и сверить его не выходя из конструкции? Например, у нас есть типичный «роутер» в index.php распределяющий, какие файлы включаем в работу скрипта на основании переменной $path

switch ($path) {
    case '/':
        require 'tpl/home.php'; // главная страница
        break;
    case '/cat1':
    case '/cat2':
    case '/cat3':
        require 'tpl/cat.php'; // страница категории
        break;
    default:
        require 'tpl/404.php'; // страница 404
        break;
}

Но представим, что категорий у нас сотни или вообще неизвестное множество. Выйти из конструкции switch и прописать условия ниже — не вариант, т.к. теряем дефолтную логику. Прописывать условия выше — такой себе вариант, поскольку, чем «тяжелее» становятся проверки, тем ниже они должны следовать в коде, нужно чтобы интерпретатор добирался до сложного кода и обрабатывал его как можно реже.

Решить эту задачу можно при помощи функции preg_filter

switch ($path) {
    case '/':
        require 'tpl/home.php'; // главная страница
        break;
    case preg_filter('#^(/cat[\d]+)$#', '$1', $path):
        require 'tpl/cat.php'; // страница категории
        break;
    default:
        require 'tpl/404.php'; // страница 404
        break;
}

Важно понимать, что секция case должна получить именно результат равный $path , в данном случае это строка. А preg_filter как раз возвращает строку лишь в том случае, если найдено совпадение(либо вернет null).

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *