我有一个使用正则表达式的自定义路由器。
问题在于我无法解析希腊字符。
以下是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
}
现在,当我尝试像http://kourtis.app/theatre/α
这样的网址时(注意最后一个字符是希腊语'alpha'),然后它会以某种方式解释为http://kourtis.app/theatre/%CE%B1
我可以在var_dump($path)
或复制粘贴网址时看到此内容。
我想它与编码有关,但所有(我能想到的)都是utf-8格式。
有什么想法吗?
更新:在评论中的建议之后,以下仅适用于 仅包含一些 希腊字符:
/theatre/[α-ωΑ-Ω-\w\d\!\.]+
并使用urldecode
解码$path
变量的百分比编码。
产生错误的一些字符是:κ
π
ρ
χ
。
现在的问题是......为什么?
(顺便说一句,这适用于许多字符/theatre/.+
)
答案 0 :(得分:1)
您可以使用
$router->get('/theatre/[^/]+', 'TheatreController', 'single_post');
因为[^/]+
将匹配 /
以外的一个或多个字符,因为[^...]
是一个匹配任何字符的否定字符类 char,但是在课堂上定义的那个。
请注意,如果您使用\d
(\w
已匹配数字),则不必使用\w
。
另外,你没有将变音符号与你的正则表达式相匹配。如果您需要匹配变音符号,请将\p{M}
添加到正则表达式:'/theatre/[-\w\p{M}!.]+'
。
请注意,要允许\w
匹配Unicode字母/数字,您需要将/u
修饰符传递给正则表达式:$found = preg_match("#^$value$#u", $path)
。这将把输入字符串视为Unicode字符串,并使\w
知道Unicode的速记模式。
另一件事:您无需在角色类中转义.
。
模式详情:
#...#
- 正则表达式分隔符^
- 字符串开头$value
- $value
变量内容(因为PHP中的双引号字符串允许插值)$
- 字符串结尾#u
- 启用 PCRE_UTF 和 PCRE_UCP 选项的修饰符。在此处查看有关他们的更多信息