---------------------------程序001----------------------------------------------
$url='localhost/lrphp/home/index/index-a-b-c.html?x=dfdfdf';
$u=preg_replace('#(?<=.-.-.-).*(?=\.html)#','replace',$url);echo $u.'<br>';$u=preg_replace('#(?<=.-.-).*(?=-.\.html)#','replace',$url);echo $u.'<br>';$u=preg_replace('#(?<=.-).*(?=-.-.\.html)#','replace',$url);echo $u.'<br>';
运行结果:
---------------------------程序001----------------------------------
---------------------------程序002----------------------------------
$url='localhost/lrphp/home/index/index-aa_1-b_b-2c3c.html?x=dfdfdf';$u=preg_replace('#(?<=.*-.*-.*-).*(?=\.html)#','replace',$url);echo $u.'<br>';$u=preg_replace('#(?<=.*-.*-).*(?=-.*\.html)#','replace',$url);echo $u.'<br>';$u=preg_replace('#(?<=.*-).*(?=-.*-.*\.html)#','replace',$url);echo $u.'<br>';
运行结果:
我想要的运行结果:
localhost/lrphp/home/index/index-aa_1-b_b-replace.html?x=dfdfdf
localhost/lrphp/home/index/index-aa_1-b_replace-2c3c.html?x=dfdfdf
localhost/lrphp/home/index/index-replace-b_b-2c3c.html?x=dfdfdf
---------------------------程序002----------------------------------
程序001是我想要的结果,没错,因为 . 在正在表达式里代表一个任意字符。
我明白,程序002为什么会报错,.*在正则表达式里不是代表任意字符串吗?
求大神指点迷津,修改程序002,达到我要的结果。
我不明白,程序002为什么会报错
a_b_c a,b,c三个位置,三个字符串是不固定的。难道真的只能这样吗?那么正则表达式也太不灵活了。
追答JavaScript中只支持顺序环视,不支持逆序环视。
Perl中 支持逆序,但长度要求固定(量词? 也不支持)。
Java中虽然顺序环视和逆序环视都支持,但是逆序环视只支持长度确定的表达式,逆序环视中量词只支持“?”,不支持其它长度不定的量词。长度确定时,引擎可以向左查找固定长度的位置作为起点开始尝试匹配,而如果长度不确定时,就要从位置0开始尝试匹配,处理的复杂度是显而易见的。
目前只有.NET中支持不确定长度的逆序环视。
一般情况也能应对, 不支持逆序的 也有一些复杂办法做一些 逆序环视可以处理的事情。所以不要伤心,发现他的长处,肯定有办法完成你的要求。
就像Perl书上说的There's more than one way to do it.