Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带有正则表达式的CodeIgniter路由问题_Php_Url_Codeigniter_Routes - Fatal编程技术网

Php 带有正则表达式的CodeIgniter路由问题

Php 带有正则表达式的CodeIgniter路由问题,php,url,codeigniter,routes,Php,Url,Codeigniter,Routes,我在使用CodeIgniter路由函数时遇到了一个小问题 我使用了,我想改变所有的路线 对用户/login的“lang/login”(例如en/login或de/login)请求我尝试按如下方式使用routes功能,但不起作用: $route['(\w{2})/login']=“/user/index” 但是,这确实有效: $route['en/login']=“/user/index” $route['de/login']=“/user/index” 但是工作版本非常糟糕,它会产生冗余代码,如

我在使用CodeIgniter路由函数时遇到了一个小问题

我使用了,我想改变所有的路线 对用户/login的“lang/login”(例如en/login或de/login)请求我尝试按如下方式使用routes功能,但不起作用:

$route['(\w{2})/login']=“/user/index”

但是,这确实有效:

$route['en/login']=“/user/index”
$route['de/login']=“/user/index”

但是工作版本非常糟糕,它会产生冗余代码,如果你想添加一种新的语言,你必须做很多改变

我希望有人能像往常一样给出明智的答案。提前谢谢。

试试类似的方法

$route['.+/login'] = "/user/index";
因为你不需要匹配的语言代码。 我猜您的
(\w{2})
表达式的解释有问题,可能您还需要尝试以下方法:

$route['[a-z]+/login'] = "/user/index";

任何使用RegEx的路由都必须放置在
scaffolding\u trigger
default\u controller
的保留路由之后,这很可能是您的问题。

或尝试$route[':Any/login']=“/user/index”

这三个都不适合我

只是提供一些更多的信息:我正在本地服务器上运行它

我还有一个.htaccess文件,其代码如下:

AddCharset utf-8.css.html.xhtml
选项+以下符号链接
重新启动发动机 重写基础/
1美元^(索引\.php | images | css | robots\.txt)
重写规则^(.*)$/www/veare/index.php/$1[L]

我得到一个404错误


希望你有更多的想法。谢谢。

以下是处理路由的正则表达式部分的代码:

//在路由阵列中循环查找通配符

    foreach ($this->routes as $key => $val)
    {                       
        // Convert wild-cards to RegEx
        $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));

        // Does the RegEx match?
        if (preg_match('#^'.$key.'$#', $uri))
        {           
            // Do we have a back-reference?
            if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
            {
                $val = preg_replace('#^'.$key.'$#', $val, $uri);
            }

            $this->_set_request(explode('/', $val));        
            return;
        }
    }
我会试试看

$route['\w\w/login'] = "/user/index";

以下内容适用于我(前提是语言始终为小写):

正如Watain提到的,因为您不需要匹配的lang.代码,所以可以删除“(”and')”


真正的错误和解决方案

哎,, 如果有人有同样的问题,我发现了真正的错误

是route.php中的一行

//路由示例:http://domain.tld/en/controller => http://domain.tld/controller
$route['(\w{2})/(.*)]='$2'
$route['(\w{2})]=$route['default_controller']

这是分机的

您需要将所有路线放在前面,如下所示:

$route['(\w{2})/signup']=“用户/注册”
//路线示例:http://domain.tld/en/controller => http://domain.tld/controller
$route['(\w{2})/(.*)]='$2'
$route['(\w{2})]=$route['default_controller']


无论如何,谢谢你在这篇文章中的帮助。你太棒了。

这似乎不太管用。你需要我提供更多的信息吗?如果有任何帮助,请让我知道如何更容易地帮助我。谢谢,我想问题是,CI不喜欢我使用正则表达式和普通名称。所以我也需要在正则表达式中告诉“login”。可悲的是,我在正则表达式方面完全是个傻瓜,那么我该怎么做呢?这似乎现在起作用了。我不知道为什么,但正则表达式根本不起作用。无论如何,谢谢你。
$route['([a-z]{2})/login'] = '/user/index';
$route['[a-z]{2}/login'] = '/user/index';