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

2023-12-31

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

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


以下是一些来自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/.+)


您可以使用

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

as [^/]+将匹配一个或多个字符以外的字符/ since [^...] is a 否定字符类匹配除类中定义的字符之外的任何字符。

请注意,您不必使用\d如果你用过\w (\w已经匹配数字)。

另外,您没有将变音符号与正则表达式匹配。如果需要匹配变音符号,请添加\p{M}到正则表达式:'/theatre/[-\w\p{M}!.]+'.

请注意,要允许\w要匹配 Unicode 字母/数字,您需要通过/u正则表达式的修饰符:$found = preg_match("#^$value$#u", $path)。这会将输入字符串视为 Unicode 字符串,并制作速记模式,例如\wUnicode 识别。

另一件事:你不需要逃避.在字符类中。

图案细节:

  • #...#- 正则表达式分隔符
  • ^- 字符串的开头
  • $value - the $value变量内容(因为 PHP 中的双引号字符串允许插值)
  • $- 字符串结尾
  • #u- 修改器启用PCRE_UTF and PCRE_UCP选项。在这里查看有关他们的更多信息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式 - URL 中的希腊字符 的相关文章

随机推荐