preg_replace 和美元符号

preg_replace and dollar sign

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

输出是asdf.jpgea.pngpng,为什么最后有两个png

同时,

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

输出asdf.jpgea.jppng.

* 是否影响 $ 的行为方式?

*(0 次或多次)不会影响 $ 符号的行为方式,但您需要将其更改为 +(1 次或多次)获得您期望的结果:

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

本质上,* 导致 jpg 匹配 两次 而不是一次,因为 * 也什么都不匹配。

这背后的技术解释非常复杂,我不想把它全部打出来,所以这里有一个很好的 link 其他人解释的地方: