У меня есть настраиваемый маршрутизатор, который использует регулярное выражение.
Проблема в том, что я не могу разобрать греческих персонажей.
Вот несколько строк из 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 . Узнайте больше о них здесь