前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >substr_replace如何替换多个字符串不同位置不同长度的子串

substr_replace如何替换多个字符串不同位置不同长度的子串

作者头像
写PHP的老王
发布2019-08-12 15:33:17
1.8K0
发布2019-08-12 15:33:17
举报
文章被收录于专栏:写PHP的老王写PHP的老王

都知道substr_replace可以替换指定位置的子串。比如substr_repace("Hello Test",'xxxx',1,4)替换成Hxxxx Test

那么如何实现替换多个字符串不同位置不同长度的子串。

代码语言:javascript
复制
$data = [
'Hello Test',
'QQ mytest',
'Sina email'
]

比如上面一个数组,现在需要把数组第i个元素的第i个字符串后面的4个字符串替换陈xxxx

代码语言:javascript
复制
$data = [
'Hxxxx Test',
'QQxxxxest',
'Sinxxxxail'
]

其实,substr_replace也可以实现多个字符串子串的替换。

substr_replace函数定义

代码语言:javascript
复制
substr_replace ( 
mixed $string , 
mixed $replacement ,
mixed $start [,mixed $length] 
) : mixed

substr_replace源码在ext/standard/string.c中。先看一下整体的结构

substr_repace首先根据替换需要替换的内容的类型区分。字符类型和数组类型的替换采用不同的处理方式。同时字符类型也对起始位置参数from做了限制,这中情况下,不接受数组类型作为起始位置。

对于字符数据的替换

如果替换的目标是一个数组,则取数组第一个元素作为实际替换的内容。

l是传入的第四个参数处理之后的长度值(l取值0-原字符串长度)。然后执行三个copy操作,分别把from之前的原始字符串,替换后的字符串,from+l之后的字符串拷贝到结果字符串中取。所以说,这里的l指定的是原字符串有多少个字符被替换。

如果要替换的内容是一个字符串数组的话,内部处理结构如下:

执行一个for循环,拆分成对每个数组元素的处理。在数组处理中,需要处理起始位置参数,长度参数是数组的情况。所以循环中对form,len,repl参数类型进行检查。如果是数组类型,则在每次替换之后下标进行加一操作。保证每次循环,获取到的是对应于该数组元素需要替换的内容,起始位置,和替换长度。

对于substr_replace有以下几点需要了解:

1. length长度是指替换长度,用repacement替换 string[start]...string[start+length],下面几个实例能够很好的说明其中的含义。

length长度小于替换字符串长度的时候,比如substr_replace('Hello Test','xxxx',2) 输出内容Hxxxxlo Test。

length长度大于替换字符串长度,比如substr_replace('Hello Test','xxxx',6) 输出内容Hxxxxest

length大于原字符串长度的时候,比如substr_replace('Hello Test','xxxx',12) 输出内容Hxxxx

2. string为字符串的时候,replacement可以是数组,实际替换是去数组第一个元素

substr_replace('Hello Test',['xxxx'],4)实际上和substr_replace('Hello Test','xxxx',4)效果一样

3. 当需要替换的内容是数组的时候,replacement,from,length可以是数组,也可以部分是数组。php对于几个数组参数,如果不对应会进行相应的处理

代码语言:javascript
复制
$s1 = substr_replace(
["Hello Test"], 
["xxxx"],
[1,2],[3,4]
);
$s1=>[ [0]=>'Hxxxxo Test'
]

起始位置和长度比要替换的内容多,自动忽略。

代码语言:javascript
复制
$s2 = substr_replace(
["Hello Test","qqqq"], 
["xxxx"],
[1],
[3]
);
$s1=>[ [0]=>'Hxxxxo Test', [1]=>''
]

原数组多,替换后数组少,则相当于替换成空字符串,即等价于一下内容:

代码语言:javascript
复制
$s2 = substr_replace(
["Hello Test","qqqq"], 
["xxxx",""],
[1],
[3]
);

$s1=>[ [0]=>'Hxxxxo Test', [1]=>''
]
代码语言:javascript
复制
$s2 = substr_replace(
["Hello Test","qqqq"], 
["xxxx","ff"],
[1],
[3]
);
$s1=>[ [0]=>'Hxxxxo Test', [1]=>'ff'
]

替换起始位置,长度数组不够,则认为起始位置是0,长度是整个字符串。即等价于:

代码语言:javascript
复制
$s2 = substr_replace(
["Hello Test","qqqq"], 
["xxxx","ff"],
[1,0],
[3,strlen("qqqq")]
);
$s1=>[ [0]=>'Hxxxxo Test', [1]=>'ff'
]

如果部分参数不是数组,则对需要替换的数组都是有效的。

代码语言:javascript
复制
$s2 = substr_replace(
["Hello Test","qqqqq"],
"xx",
[1,0],
3);
$s1=>[ [0]=>'Hxxo Test', [1]=>'xxqq'
]

等价于

代码语言:javascript
复制
$s2 = substr_replace(
["Hello Test","qqqqq"], 
["xx","xx"],
[1,0],
[3,3]
);
$s1=>[ [0]=>'Hxxo Test', [1]=>'xxqq'
]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档