正则表达式 - URL中的希腊字符

时间:2016-08-22 09:53:55

标签: php regex url routing url-encoding

我有一个使用正则表达式的自定义路由器。

问题在于我无法解析希腊字符。

以下是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/.+

1 个答案:

答案 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 选项的修饰符。在此处查看有关他们的更多信息