php 关于str_replace 的奇怪问题,该函数有bug?

做了一个批量在线翻译功能,功能是把html标签替换成数字,以免被翻译,结果替换好后,生成一大串连续的数字,由于api经常有长度限制,所以必须在此替换短的,于是问题来了,$ss为替换html后的原文

$ss="lankii1lankii:55 lankii1lankiilankii3lankii?? lankii4lankiilankii5lankiilankii5lankii【lankii7lankii型号】7010lankii7lankiilankii9lankiilankii10lankiilankii3lankiilankii4lankiilankii5lankiisimhei【颜 色】红、橙、灰lankii7lankiilankii9lankiilankii10lankiilankii3lankiilankii4lankiilankii5lankii【比 例】1:16lankii7lankiilankii9lankiilankii10lankiilankii3lankiilankii4lankiilankii5lankii【适合年龄】5lankiikii4lankiilankii5lankii jewelryself.com【特 点】lankii7lankiilankii9lankiilankii10lankiilankii3lankiilankii4lankiilankii5lankii①按照国际标准原厂1:16比例生产,风向盘遥控。lankii77lankii(注意:此款车不具备重力感应)lankii9lankiilankii7lankiilankii5lankiilankii51lankiilankii5lankii②lankii7lankiilankii7lankiilankii5lankii模型前后车轮均可遥模型收藏者的最爱 适合大人小朋友。lankii7lankiilankii9lankiilankii10lankiilankii3lankiilankii4lankiilankii5lankiilankii112lankiilankii1lankiilankii1lankiilankii115lankiilankii1lankiilankii1lankiilankii118lankiilankii1lankiilankii1lankii1:16仿真名车,三款混装,随机发货。lankii7lankiilankii9lankiilailankii4lankiilankii5lankiilankii127lankiilankii1lankiilankii1lankiilankii130lankiilankii1lankiilankii1lankiilankii133lankiilankii1lankiilankii1lankii遥控器概况,遥控器需要四节5号电池,需要自备。lankii77lankii(此款车不配备重力感应,左右转需要通过扭转风向盘控制)";
//问题长度限制,删除部分
$regx="/[0-9a-z: \?\/r\/n]+/ie";

preg_match_all($regx,$ss,$matches);
print_r($matches[0]); //正常需要提取的字符串;echo str_replace($matches[0],'99',$ss); //替换结果根本不是你想要的结果,我用foreach在 强制(string)下,还是那样的问题,用preg_replace也是这个


比如 $matches[0][0]="lankii34543543lsnkiii lsnser23453454535errtrt";
用 str_replace,他是支持数组替换的

清晰点用 foreach 替换,即
foreach( $matches[0] as $m){
$ss=str_replace($m,'99',$ss);

}
正常的情况应该是把含有$matches[0][0]的字符串替换掉了,而实际呢,他只在前2次左右的正常替换,后面程序只替换其中的数字为99。preg_replace也是一样的结果,如果单独,用双引号拿出来替换是正常的,
其中我已经设置了 ini_set('pcre.backtrack_limit', 999999999);所以不存在替换字符串长度问题,编码是UTF-8
---------------------搞定-----------------
a:5:{жно место, где русский хит голоден и электричество <did> воды низкой скорости восстановления

我没搞明白你到底想怎样删减,不过你说下所谓的bug,
你知道preg_match_all匹配的结果matches是个二维数组吗,
matches[0]这个是一个数组啊,
str_replace将ss字符串中所有在matches[0]数组中的子串都替换为99追问

我也没搞明白,你说了什么。

目前的我发现的bug是,用preg_match_all 匹配出的结果数组matches[0]中是我的目标需要替换掉的字符串,也就是print_r($matches[0]);出的结果是我想要替换掉的字符串数组

追答

你是不是想将匹配出来的结果都替换成99

追问

首先谢谢你的耐心回答,但是不要回复一些这么肤浅的回答,php我也算有些道行了,从批量采集到自动生成匹配,等等一些强大的功能都已经实现,而且我早已经说的很明白,preg_replace早已经用过,大家都知道,str_replace效能比他高很多,而且字符串都已经是固定的。你到现在我估计都没测试过我上面的代码,所以你根本不知道出现的bug

追答

高手,你是高手,
代码我执行过了,可能我的语文是体育老师教的吧,我真没看出来bug是什么,我只看到替换顺序错误导致没有达到理想结果,
从字面意思上,我理解到的你的问题是
ss字符串替换得结果
“99【99型号】99【颜99色】红、橙、灰99【比99例】99【适合年龄】99.99【特99点】99①按照国际标准原厂99:99比例生产,风向盘
遥控。99(注意99此款车不具备重力感应)99②99模型前后车轮均可遥模型收藏者的最爱99适合大人小朋友。99仿真名车,三款混装,随机发货。99
遥控器概况,遥控器需要四节99号电池,需要自备。99(此款车不配备重力感应,左右转需要通过扭转风向盘控”
但是使用str_replace结果没有替换完全,按照你说的“只在前2次左右的正常替换,后面程序只替换其中的数字为99“,那是因为第二次替换的是“lankii7lankii”,那第三个替换的“7010lankii7lankiilankii9lankiilankii10lankiilankii3lankiilankii4lankiilankii5lankiisimhei”,ss中已经变成了7099099lankii9lankiilankii990lankiilankii3lankiilankii4lankiilankii99lankiisimhei,所以不能匹配到了,
str_replace按照matches[0]的数字索引顺序进行替换,如果想达到效果,需要按照子串长度从大到小替换,
这就是我从你的问题中理解到的,你是高手,对你来说是肤浅,我只是个程序员,能力有限,只能理解到这些,至于你的问题有没有其他的玄机,那可能就是高手和普通人的差距吧,在百度上回答问题,就是个学习的过程,毕竟自己碰到的问题有限,看看别人遇到的问题,顺便帮忙解决下,看到和高手的差距,总得上进不是,这就是我在百度知道的意义!

追问

哥们多谢你耐心回答,你说的问题其实我没写上来,实际上我前面是有一步,是根据数组中的字符串长度排序,而且限定了部分长度大于7才执行,由于知道问答只能限定长度,$ss值不完整,

比如preg_match_all 出来是一堆长的数值,9897972934972394729385723957298374892374 ,你即使(string)$ss,执行str_replace 他也是当成数字执行

温馨提示:答案为网友推荐,仅供参考