Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在注释中按名称替换id,但不替换错误的大小写_Php_Replace - Fatal编程技术网

Php 在注释中按名称替换id,但不替换错误的大小写

Php 在注释中按名称替换id,但不替换错误的大小写,php,replace,Php,Replace,我有一条评论,其中包含如下提到的用户ID: $subject = "@1 likes @12 and @123"; $subjectReplaced = "@Henry likes @Henry2 and @Henry23" // What I want is: $subjectReplaced = "@Henry likes @Tony and @Pizza"; 现在我想用数组中的真实名称替换这些ID: $users = [1 => "Henry", 12 => "Tony"

我有一条评论,其中包含如下提到的用户ID:

$subject = "@1 likes @12 and @123";
$subjectReplaced = "@Henry likes @Henry2 and @Henry23"

// What I want is:
$subjectReplaced = "@Henry likes @Tony and @Pizza";
现在我想用数组中的真实名称替换这些ID:

$users = [1 => "Henry", 12 => "Tony", 123 => "Pizza"];
我陷入了这样的境地:Henry用户可以替换所有包含@1的id,如下所示:

$subject = "@1 likes @12 and @123";
$subjectReplaced = "@Henry likes @Henry2 and @Henry23"

// What I want is:
$subjectReplaced = "@Henry likes @Tony and @Pizza";
有人帮我吗

完整代码如下:

<?php

$subject = "@1 likes @12 and @123";
$users = [1 => "Henry", 12 => "Tony", 123 => "Pizza"];

foreach ($users as $id => $user) {
  $subject = str_replace('@' . $id, '@' . $user, $subject);
}

echo $subject;

您可以使用
array\u walk
str\u replace

$subject = "@1 likes @12 and @123";
$patterns = ['1' => 'Henry','12' => 'Tony' ,'123' => 'Pizza'];
$previousKey ='';
array_walk($patterns, function($v, $k) use (&$subject, &$previousKey, $patterns){
    if(!empty($previousKey))
      $subject = str_replace(str_replace($previousKey, $patterns[$previousKey], $k), $v, $subject);
 else
      $subject = str_replace($k, $v, $subject);
$previousKey = $k;
    $previousKey = $k;
});
echo $subject;

你可以根据空格分解你的
主题
,并对收到的每个令牌进行
预匹配。如果令牌与您的
@某些文本
格式匹配,我们将在下面的
主题数据
数组中进行替换。最后,我们只需执行一个内爆()来获得替换的字符串

<?php

$users = ['1' => "Henry", '12' => "Tony", '123' => "Pizza"];

$subject = "@1 likes @12 and @123";

$subject_data = explode(" ",$subject);

foreach($subject_data as $key => $each_data){
    if(preg_match('/@.+/',$each_data) === 1){
        $subject_data[$key] = "@" . $users[substr($each_data,1)];
    }
}

echo implode(" ",$subject_data);

另一种方法是使用
preg_split
来断开字符串,然后循环通过断开字符串的各个部分,并用关联的用户id替换id,最后使用
内爆来连接字符串部分

$subject = "@1 likes @12 and @123";

$users = [1 => "Henry", 12 => "Tony", 123 => "Pizza"];

$parts = preg_split("/(\@\d*)/", $subject, 0, PREG_SPLIT_DELIM_CAPTURE);

foreach ($parts as &$part) {
    if (strpos($part, '@') !== 0) {
        continue;
    }

    $part = $users[substr($part, 1, strlen($part) - 1)] ?? '';
}


$result = implode($parts);

echo $result;
结果: 亨利喜欢托尼和比萨饼

测试它

您可以使用它来进行替换
strtr
对这项工作很好,因为它先替换较长的字符串,然后就不会再查看它们了,所以它避免了可能出现的双重替换问题

$subject = "@1 likes @12 and @123";
$users = [1 => "Henry", 12 => "Tony", 123 => "Pizza"];
echo strtr($subject, $users);
输出:

@Henry likes @Tony and @Pizza

请给我们看代码?@AmitMerchant编辑,更新完整代码为什么您完全更改了
$users
。不是我想的want@HenryBui答案已更新。@HenryBui这正是strtr的作用。你的答案很简单。