Php 在注释中按名称替换id,但不替换错误的大小写
我有一条评论,其中包含如下提到的用户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"
$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的作用。你的答案很简单。