preg_replace替换内容中间部分

需求是这样:用正则匹配一个HTML文件中<img />标记中的图片地址

最初的实现:

$img = '<img src="bbb.jpg" style="width: 100px; height: 100px;">';
$newImg = preg_replace('/<img\s+src=[\'"].*?[\'"].*>/i','<img src="aaa.jpg" style="width: 100px; height: 100px;">',$img);
echo $newImg;

这样虽然没有问题,但是不符合我最初的想法,我的想法是只替换src里的内容,保留左右两边的标签及属性。

看手册,对preg_replace()中第二个参数有这样的描述:

replacement中可以包含后向引用\\n 或(php 4.0.4以上可用)$n,语法上首选后者。每个这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n 可以是0-99,\\0和$0代表完整的模式匹配文本。 捕获子组的序号计数方式为:代表捕获子组的左括号从左到右, 从1开始数。

“翻译”成菜鸟语言就是正则表达式中的每个组可以在该参数中用\\n或者$n代替

OK,对程序做个小改造就可以满足需求啦

$img = '<img src="bbb.jpg" style="width: 100px; height: 100px;">';
$newImg = preg_replace('/(<img\s+src=[\'"])(.*?)([\'"].*>)/','$1aaa.jpg$3',$img);
echo $newImg;

将<img src=" 分为组1,在relacement里用$1表示;

bbb.jpg本来可以用$2表示,但是这里我们需要进行替换,所以直接用aaa.jpg替换就ok;

" style="..."..>分为组3,同1

done

在手册中也说到这样一个问题,如果我们的aaa.jpg要更名为1.jpg 那么replacement就变成了$11.jpg$3,组1的名产生了歧义,办法就是改成${1}1.jpg${3},所以在实际应用中,无论会不会产生歧义,加上大括号更严谨些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值