Home  >  Article  >  Backend Development  >  preg_replace replaces the middle part of the content

preg_replace replaces the middle part of the content

WBOY
WBOYOriginal
2016-08-08 09:26:191434browse

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

最初的实现:

$img = '<img src="bbb.jpg" style="width: 100px; height: 100px;">';
$newImg = preg_replace('/<img\s+src=[\&#39;"].*?[\&#39;"].*>/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=[\&#39;"])(.*?)([\&#39;"].*>)/','$1aaa.jpg$3',$img);
echo $newImg;

分为组3,同1

done

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

以上就介绍了preg_replace替换内容中间部分,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn