@lexstile

Как корректно осуществить замену в preg_replace в моем случае?

Есть роуты:
# LetterController
	'letter' => [
		'controller' => 'letter',
		'action' => 'index',
	],
	# пагинация для страницы /letter/ (вид: /letter/index/2/)
	'letter/index/{page:\d+}' => [
		'controller' => 'letter',
		'action' => 'index',
	],
	'letter/{page:[а-яё]{1,2}}' => [
		'controller' => 'letter',
		'action' => 'detail',
	],
	# как сделать обработку подобного роута для пагинации на детальной странице (функции см. ниже)?
	'letter/{page:[а-яё]{1,2}}/detail/{page:\d+}' => [
		'controller' => 'letter',
		'action' => 'detail',
	],

Функции для обработки:
public function add($route, $params) {
		# на данный момент не совсем корректно работает замена, поэтому match() возвращает false
		$route = preg_replace('/{([a-z]+):(.+)}/ui', '(?P<\1>\2)', $route);
		$route = '#^'.$route.'$#u';
		$this->routes[$route] = $params;
	}

	public function match() {
		$url = urldecode(html_entity_decode(trim($_SERVER['REQUEST_URI'], '/')));
		foreach ($this->routes as $route => $params) {
			echo $route . ' - ' . $url . '<br/>';
			// #^letter/(?P[а-яё]{1,2}}/detail/{page:\d+)$#u - letter/а/detail/2
			// рабочий пример замены в функции add():
			// #^letter/index/(?P\d+)$#u - letter/index/2
			if (preg_match($route, $url, $matches) === 1) {
				foreach ($matches as $key => $match) {
					if (is_string($key)) {
						if (is_numeric($match)) {
							$match = (int) $match;
						}
						$params[$key] = $match;
					}
				}
				$this->params = $params;
				return true;
			}
		}
		return false;
	}
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
php666
@php666
PHP-макака
html_entity_decode
прежде, чем что-то писать, надо включать голову.
https://www.php.net/html_entity_decode
Какое отношение HTML имеет к HTTP?

Далее по коду ничего не ясно. Всё очень усложнено. Какие-то is_string, is_numeric.... зачем все это?
Вот я описывал как сделать элементарные роуты тыц. Для того, что бы поймать имена параметров несколько строк кода
foreach ($routes as $map)
{
    if (preg_match($map['pattern'], $url_path, $matches))
    {
        // Выталкиваем первый элемент - он содержит всю строку URI запроса
        // и в массиве $params он не нужен.
        array_shift($matches);

        // Формируем массив $params с теми названиями ключей переменных,
        // которые мы указали в $routes
        foreach ($matches as $index => $value)
        {
            $params[$map['aliases'][$index]] = $value;
        }
        break;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы