<?php
// Пример маршрута
$routeData['where'] = [
'context' => '[a-z]{2}', // Параметр 'context' должен состоять из 2 символов
'alias' => '[a-z]+' // Параметр 'alias' может быть любым словом
];
// Пример URI
$uri = '/uk/services';
$pattern = '/{context}/{alias?}';
// Шаг 1: Разбираем паттерн маршрута и извлекаем параметры
preg_match_all('#\{([a-zA-Z0-9_]+)\}#', $pattern, $matches);
// Шаг 2: Заменяем параметры в паттерне на соответствующие регулярные выражения
$regex = preg_replace_callback(
'#\{([a-zA-Z0-9_]+)\}#',
function ($match) use ($routeData) {
$param = $match[1];
if (isset($routeData['where'][$param])) {
return '(' . $routeData['where'][$param] . ')'; // Применяем регулярное выражение из 'where'
} else {
return '([^/]+)'; // Если для параметра нет условия, захватываем любое значение
}
},
$pattern
);
// Добавляем начало и конец регулярного выражения
$regex = '#^' . $regex . '$#';
// Выводим итоговое регулярное выражение для отладки
var_dump($regex);
// Шаг 4: Сопоставляем URI с регулярным выражением
if (preg_match($regex, $uri, $uriMatches)) {
// Шаг 5: Проверяем, что параметр 'context' в URI соответствует регулярному выражению из 'where'
var_dump($uriMatches); // Выводим совпавшие параметры для отладки
if (isset($uriMatches[1])) { // Проверяем значение 'context'
$contextValue = $uriMatches[1]; // Значение 'context'
if (!preg_match('#^' . $routeData['where']['context'] . '$#', $contextValue)) {
echo 'NOOOOO'; // Значение 'context' не прошло проверку
} else {
echo 'context matches'; // Значение 'context' прошло проверку
}
}
} else {
echo 'URI does not match the pattern';
}