REST API终结点-接受变音符号

时间:2019-05-29 作者:MediaFormat

我正在尝试注册一个自定义端点,它将接受变音字符(重音),以便我可以用法语搜索它。

这就是我所尝试的:

register_rest_route(\'events/v1\', \'organizations/(?P<search>[a-zA-ZÀ-ž][\\wÀ-ÿ]+)\' array(
    \'methods\' => WP_REST_Server::READABLE,
    \'callback\' => \'get_event_organizations\',
    \'args\' => [
        \'search\',
    ],
));)
正则表达式应该工作:https://regex101.com/r/aM6tV1/41

但端点返回rest_no_route / 404

<小时>

EDIT

谢谢@TimI把它复杂化了!

register_rest_route(\'events/v1\', \'organizations/(?P<search>[\\w].+)\' array(
    \'methods\' => WP_REST_Server::READABLE,
    \'callback\' => \'get_event_organizations\',
    \'args\' => [
        \'search\',
    ],
));)

1 个回复
最合适的回答,由SO网友:Tim 整理而成

在我看来,WordPress在运行regex时没有启用UTF-8模式。

https://github.com/WordPress/WordPress/blob/5.2.1/wp-includes/rest-api/class-wp-rest-server.php#L837

在PHP中,匹配多字节字符需要u 旗帜(上面的代码只是添加了不区分大小写的标志)。因此,尽管有些字符串仍将匹配(如“Départment”),但它们并不能作为整个Unicode字符匹配。例如,以下模式在显示为“不应该”时匹配。

preg_match(\'@^[a-zA-ZÀ-ž][\\\\wÀ-ÿ]+$@i\',\'£\');
// returns 1
“£”匹配,因为它由两个字节组成(C2 A3)。启用UTF-8模式时,它在字符串的开头不匹配,因为作为一个字符(00A3),它在第一个字符范围内大于“z”(007A),但小于“À”(00C0)。

preg_match(\'@^[a-zA-ZÀ-ž]@iu\',\'£\');
// returns 0
因此,如果没有看到您无法匹配的特定输入字符串,这可能解释了它不起作用的原因。可能您不需要指定这样一个特定的模式,并且可以将任何字节与.+ 遵循安全匹配的前缀。