首页 > 解决方案 > 在控制器 Symfony 中排除字符串 url

问题描述

我希望我的控制器适用于除 url 'abc' 之外的所有内容。

 /**
     * @Route(path="/api/{url}", name="test", requirements={"url"=".+"})
     */
    public function index(string $url)
    {
       ...
    }

如何转换正则表达式 url"url"=".+"以便它可以发送给除“abc”之外的所有人?

标签: phpsymfony

解决方案


路由参数

requirements 选项定义了路由参数必须匹配才能匹配整个路由的PHP 正则表达式。

在您的情况下,您希望允许除特定字符串之外的所有内容。

^((?!abc).)*$如果您不希望您的 url 参数包含字符串,只需使用常规正则表达式abc

请注意,abcde否则dabc将不起作用。

所以你的路线是

/**
 * @Route(path="/api/{url}", name="test", requirements={"url"="^((?!abc).)*$*"})
 */
public function index(string $url)
{
   //allow foo
   //allow bar
   //block abc
   //block fooabc
   //block barabc
}

如果您想允许字符串包含 abc 则将您的正则表达式更改为\b(?!abc\b)\w+

/**
 * @Route(path="/api/{url}", name="test", requirements={"url"="\b(?!abc\b)\w+"})
 */
public function index(string $url)
{
   //allow foo
   //allow bar
   //block abc
   //allow fooabc
   //allow barabc

}

请注意,您还可以添加更多单词\b(?!foo|bar\b)\w+


推荐阅读