关于php的正则表达式问题。

---------------------------程序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为什么会报错

因为 (?<=xxxx) 是逆序环视,大部分的 正则表达中都要求 这部分代表的字符是 固定长度。
即使是(?<=ab?) 想匹配 a或ab ——这都有可能是错误的,更不用说 .* 了

第一个 正则改成 (?<=\w-)\w+(?=\.html)
第二个:改为 (?<=\w_)\w+(?=-\w+\.html)
第三个 改为 (?<=-)\w+(?=_[^_]+_[^_]+\.html)

从你运行提示里面也能看到:Lookbehind **【逆序环视】is not fix length***【长度不固定】追问

a_b_c a,b,c三个位置,三个字符串是不固定的。难道真的只能这样吗?那么正则表达式也太不灵活了。

追答

JavaScript中只支持顺序环视,不支持逆序环视。
Perl中 支持逆序,但长度要求固定(量词? 也不支持)。
Java中虽然顺序环视和逆序环视都支持,但是逆序环视只支持长度确定的表达式,逆序环视中量词只支持“?”,不支持其它长度不定的量词。长度确定时,引擎可以向左查找固定长度的位置作为起点开始尝试匹配,而如果长度不确定时,就要从位置0开始尝试匹配,处理的复杂度是显而易见的。
目前只有.NET中支持不确定长度的逆序环视。

一般情况也能应对, 不支持逆序的 也有一些复杂办法做一些 逆序环视可以处理的事情。所以不要伤心,发现他的长处,肯定有办法完成你的要求。
就像Perl书上说的There's more than one way to do it.

温馨提示:答案为网友推荐,仅供参考
相似回答