2017-10-11 80 views
0
preg_replace('/[^.]*$/','png','asdf.jpgea.jpg') 

输出是asdf.jpgea.pngpng,为什么最后有两个pngpreg_replace和美元符号

同时,

preg_replace('/\w$/','png','asdf.jpgea.jpg') 

输出asdf.jpgea.jppng

*影响$的行为方式吗?

+1

这已经被问了很多次。 '*'使它匹配一个空字符串。 '$'是一个零宽度断言,因此第一个匹配是字符串结尾之前的空字符串,第二个匹配是字符串本身的结尾。它不影响所有的正则表达式,但大多数都是。 –

回答

0

*(0次或更多次)不影响$标志的行为,但你需要将其更改为+(1次以上),以获得您所期望的结果:

preg_replace('/[^.]+$/','png','asdf.jpgea.jpg'); 

实质上,*导致jpg获得匹配两次而不是一次,因为*也没有匹配任何内容。

这背后的技术解释是相当复杂的,而且我不喜欢打字了这一切,所以这里是一个很好的链接,别人解释它:

https://stackoverflow.com/a/3420778/8001997