我在静态html文件中有一堆网址需要更改.
他们现在看起来像这样:
<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />
他们需要看起来像这样:
<img src="imgxyz.jpg" />
所以,我刚写了一个php脚本,打开每个脚本并执行preg_replace().
我的正则表达式(使用双重反斜杠,是):
$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'
$replacement = '<img src="$0" />' ;
Run Code Online (Sandbox Code Playgroud)
因此,我只会在/ images之前捕获任何内容,直到结束报价.
但我得到的是:
<img src="<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />" />
似乎捕获组过于热心......或者某些东西与/ foldera/folderb部分不匹配.
这里发生了什么?
使用$1的替代品.$0匹配整个模式.你想要第一组.
$replacement = '<img src="$1" />' ;
Run Code Online (Sandbox Code Playgroud)
更好的方法是basename作为替换的一部分使用:
$regex = '/(<img src=")([^"]*)"( \\/>)/e';
$replacement = "stripslashes('\$1').basename(stripslashes('\$2')).stripslashes('\$3')";
Run Code Online (Sandbox Code Playgroud)