求助 URI.php中的一个函数不明白是什么意思
本帖最后由 小凡 于 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[] 数组是什么呢??
就是
array(0=>'home',1=>'index'); 本帖最后由 小凡 于 2011-8-11 01:06 编辑
jeongee 发表于 2011-8-10 22:09 static/image/common/back.gif
就是
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);这两个* 少了一个都不成,这个两个*在这里到底起了什么作用呢???
本帖最后由 jeongee 于 2011-8-11 10:03 编辑
小凡 发表于 2011-8-11 00:01 static/image/common/back.gif
刚查了些资料,明白些了,但是还有一个地方不明白,你看我说的啊:$a="/home/index";
$b=preg_replace("|/ ...
我正则菜鸟,不过*是匹配0次或N次的吧 小凡 发表于 2011-8-11 00:01 static/image/common/back.gif
刚查了些资料,明白些了,但是还有一个地方不明白,你看我说的啊:$a="/home/index";
$b=preg_replace("|/ ...
$a = '/home/index';
preg_match("|/*(.+?)/*$|",$a,$b);
print_r($b);
试试这段程序,也许帮助理解 本帖最后由 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 ( => /page/2 => 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
页:
[1]