php正则匹配多个结果,按位置替换结果
今天在项目中出现一个难题,就是正则匹配多个结果,然后用数组一个个替换
<?php function AtuserReplace($str, $replacearr) { preg_match_all("/@([\w\x{4e00}-\x{9fa5}]+)/u", $str, $arr); for ($i = 0; $i < count($arr[1]); $i++) { $str = str_replace($arr[1][$i], $replacearr[$i], $str); } return $str; } echo "替换前<br/>"; $content = '我今天早上看到彩虹了 @小李 @张三 你们那看到了吗 @小李子 @李达 公司有没有看到?<br/> '; echo $content; echo "替换后<br/>"; $replacevalue = ['用户a', '用户b', '用户c', '用户d']; echo AtuserReplace($content, $replacevalue); ?>运行后发现第三个@小李子没有变成“用户c”,变成了“用户a子”了,原来原文@小李与@小李子在第一次匹配的时候被换了,导致第三次替换的时候没找到小李子了
看来小李子改名了,导致第三个无法找到此人,看来一起替换不行,那就独立替换吧,将每个用户拉到单独房间,替换后再放出去吧
代码如下
<?php function AtuserReplace($str, $replacearr) { $_data = explode("@", $str); $i = -1; foreach ($_data as &$item) { if ($i >= 0) { $item = "@".$item; preg_match("/@([\w\x{4e00}-\x{9fa5}]+)/u", $item, $arr); if (is_array($arr) && count($arr) == 2) { if (isset($replacearr[$i])) { $item = str_replace($arr[0], '@'.$replacearr[$i], $item); } } } $i++; } return implode("", $_data); } echo "替换前<br/>"; $content = '我今天早上看到彩虹了 @小李 @张三 你们那看到了吗 @小李子 @李达 公司有没有看到?<br/> '; echo $content; echo "替换后<br/>"; $replacevalue = ['用户a', '用户b', '用户c', '用户d']; echo AtuserReplace($content, $replacevalue); ?>运行后,结果正确了
网友评论0