php正则匹配多个结果,按位置顺序替换结果

php正则匹配多个结果,按位置替换结果

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正则匹配多个结果,按位置顺序替换结果

看来小李子改名了,导致第三个无法找到此人,看来一起替换不行,那就独立替换吧,将每个用户拉到单独房间,替换后再放出去吧

代码如下

<?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);
?>

运行后,结果正确了

php正则匹配多个结果,按位置顺序替换结果



{{collectdata}}

网友评论0