Оператор 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).