Regex – греческие символы в URL-адресе

У меня есть настраиваемый маршрутизатор, который использует регулярное выражение.

Проблема в том, что я не могу разобрать греческих персонажей.


Вот несколько строк из index.php :

 $router->get('/theatre/plays', 'TheatreController', 'showPlays'); $router->get('/theatre/interviews', 'TheatreController', 'showInterviews'); $router->get('/theatre/[-\w\d\!\.]+', 'TheatreController', 'single_post'); 

Вот несколько строк из Router.php :

 $found = 0; $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); //get the url ////// Bla Bla Bla ///////// if ( $found = preg_match("#^$value$#", $path) ) { //Do stuff } 

Теперь, когда я пробую URL-адрес, например http://kourtis.app/theatre/α (обратите внимание, что последний символ является греческим «альфа»), то он каким-то образом интерпретируется как http://kourtis.app/theatre/%CE%B1

Я вижу это, когда я var_dump($path) или когда я var_dump($path) URL-адрес.


Я предполагаю, что это имеет какое-то отношение к кодированию, но все, что я могу придумать, – в формате utf-8.

Есть идеи?

——————————–

ОБНОВЛЕНИЕ: после предложений в комментариях следующее работает только с некоторыми греческими символами: /theatre/[α-ωΑ-Ω-\w\d\!\.]+ и использует urldecode для декодирования процентного кодирования $path .

Некоторыми символами, которые вызывают ошибку, являются: κ π ρ χ .

Вопрос в том, почему … почему? (BTW, это работает для многих символов /theatre/.+ )

    Вы можете использовать

     $router->get('/theatre/[^/]+', 'TheatreController', 'single_post'); 

    поскольку [^/]+ будет соответствовать одному или нескольким символам, отличным от / поскольку [^...] является отрицательным символьным классом, который соответствует любому символу char, но определенному в классе.

    Обратите внимание, что вам не нужно использовать \d если вы использовали \w ( \w уже соответствует цифрам).

    Кроме того, вы не соответствовали диакритике с вашим регулярным выражением. Если вам нужно сопоставить диакритические знаки, добавьте \p{M} в регулярное выражение: '/theatre/[-\w\p{M}!.]+' .

    Обратите внимание, что для того, чтобы \w соответствовала букв / цифр Unicode, вам нужно передать модификатор /u в regex: $found = preg_match("#^$value$#u", $path) . Это будет обрабатывать строки ввода как строки Unicode, а также создавать сокращенные шаблоны, такие как \w Unicode.

    Другое дело: вам не нужно бежать . внутри класса символов.

    Сведения о шаблоне :

    • #...# – разделители регулярных выражений
    • ^ – начало строки
    • $value – содержимое переменной $value (поскольку строки с двойным кавычками в PHP допускают интерполяцию)
    • $ – конец строки
    • #u – модификатор, позволяющий параметры PCRE_UTF и PCRE_UCP . Узнайте больше о них здесь