用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6833|回复: 5
收起左侧

求助 URI.php中的一个函数不明白是什么意思

[复制链接]
发表于 2011-8-10 21:37:46 | 显示全部楼层 |阅读模式
本帖最后由 小凡 于 2011-8-10 21:42 编辑

    function _explode_segments()         //此时 $this->uri_string 应该为 /home/index 这样的形式                                                         {     
               foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)                        
             {                             
                           $val = trim($this->_filter_uri($val));
                              if ($val != '')                    
                               {      
                                     $this->segments[] = $val;      
                               }            
                }   
    }

这个函数中的 preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string) 这个替换 我不明白是什么意思 起什么作用 为什么要这样写呢,手册中说 “逆向引用请将双反斜线语法替换为美元符语法” 可是这个逆向引用是什么意思啊 ?? 假设程序执行到这里时这个$this->uri_string 就为  /home/index  那么 最后这个 $this->segments[] 数组是什么呢??





发表于 2011-8-10 22:09:21 | 显示全部楼层
就是
array(0=>'home',1=>'index');
 楼主| 发表于 2011-8-11 00:01:13 | 显示全部楼层
本帖最后由 小凡 于 2011-8-11 01:06 编辑
jeongee 发表于 2011-8-10 22:09
就是
array(0=>'home',1=>'index');

刚查了些资料,明白些了,但是还有一个地方不明白,你看我说的啊:$a="/home/index";
$b=preg_replace("|/*(.+?)/*$|","\\1",$a);
echo $b;

此时输出的是  home/index , 我明白了这个preg_replace() 函数 为的就是去掉 最前面的 / ,然后在用explode() 函数分割时才不会使 得到的数组的第一个元素为空 ,对吧。

但是我对这个正则不太明白:如果  $b=preg_replace("|/*(.+?)/$|","\\1",$a);  或是 $b=preg_replace("|/(.+?)/$|","\\1",$a); 都会得到 /home/index  就是正则没有起作用。现在 看一下这个正则吧:|| 这个两个之间的东东应该是要被替换掉的匹配项吧,在往里面看一层/ /$ 是不是代表以这两个开头和结尾的匹配项吧,然后(.+?) 匹配这//里面的任何字串 应该正好匹配 home 吧 ,所以 后面的这个 \\1 也表示的是临时缓冲区里面的 home 啊,如果这样理解,应该得到是  用 home 替换掉 /home/ 吧 ,这样结果就应该是 homeindex  但是结果是 home/index 显然我的理解有错误,自己想了半天 还是不解  求指点,还有就是这两种写法 为什么都不起作用呢??
$b=preg_replace("|/*(.+?)/$|","\\1",$a);  或是 $b=preg_replace("|/(.+?)/$|","\\1",$a);  这两个* 少了一个都不成,这个两个*在这里到底起了什么作用呢???


发表于 2011-8-11 09:22:45 | 显示全部楼层
本帖最后由 jeongee 于 2011-8-11 10:03 编辑
小凡 发表于 2011-8-11 00:01
刚查了些资料,明白些了,但是还有一个地方不明白,你看我说的啊:$a="/home/index";
$b=preg_replace("|/ ...

我正则菜鸟,不过*是匹配0次或N次的吧
发表于 2011-8-11 10:01:04 | 显示全部楼层
小凡 发表于 2011-8-11 00:01
刚查了些资料,明白些了,但是还有一个地方不明白,你看我说的啊:$a="/home/index";
$b=preg_replace("|/ ...

$a = '/home/index';
preg_match("|/*(.+?)/*$|",$a,$b);
print_r($b);

试试这段程序,也许帮助理解
发表于 2012-8-1 22:18:46 | 显示全部楼层
本帖最后由 viqecel 于 2012-8-1 22:19 编辑

竖线其实是pattern的分界符,在php中有/(斜线),|(竖线),#(#号)3种,也就是下面3个是等价的。
<?php
    $t='/page/2';
    preg_match("|/*(.+?)/*$|",$t,$b);
    print_r ($b);
   
    $t='/page/2';
    preg_match("/\/*(.+?)\/*$/",$t,$b);
    print_r ($b);
   
    $t='/page/2';
    preg_match("#/*(.+?)/*$#",$t,$b);
    print_r ($b);
//End_php
上面返回结果为

返回   Array      (          [0] => /page/2          [1] => page/2      )   
这里使用竖线是为了/不用转义,看第二个需要\/来转义pattern中的斜线了。
*是表示0个或多个的意思,表示此处可能没有斜线,也有可能有多个斜线,即:
$t='page/2'; 或 $t='////page/2';也是能匹配的。?表示0个或1个,表示第二个斜线之前可能没有,也可能有数据,因此,/*为0,(.+?)为0,/*为0,的情况下,即$t='2';也都可以被匹配。

如果这样理解,应该得到是  用 home 替换掉 /home/ 吧 ,这样结果就应该是 homeindex  但是结果是 home/index 显然我的理解有错误,自己想了半天 还是不解  求指点,还有就是这两种写法 为什么都不起作用呢??

你上面的理解不全面吧.人家前面不是有后面这句了嘛,explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string))
explode这个函数目的就是把得到的字符串以/分割到数组中.怎么可 能得到homeindex

本版积分规则