我有一个代表星期几的字符串" U"," M"," T"等等"。我试图使用preg_replace将字母替换为实际的日期名称,如星期日,星期一等。
然而,它似乎是以迭代的方式应用替换数组,而documentation似乎没有指定。有什么想法吗?
$input = "U";
$nice_day_name = preg_replace(['/U/','/M/','/T/','/W/','/R/','/F/','/S/'],
['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
$input);
// Outputs "Satun", should be "Sun"
答案 0 :(得分:3)
The documentation似乎含糊不清。以下是关于这个主题的内容:
如果
pattern
和replacement
参数都是数组,则每个pattern
都将被replacement
对应项替换。
看起来您正在阅读这个" 原始字符串将针对数组中的每个模式进行检查,并且将进行替换"。我可以看到一个人会怎样读它。它似乎正在做的是根据字符串检查每个模式,包括已经进行的任何替换。
所以它这样做:
/U/
,找到匹配项,进行替换 - > Sun
/S/
,找到匹配项(第一个字符),进行替换 - > Satun
要解决此问题,您可以在每个模式中包含开始/结束字符:
['/^U$/','/^M$/','/^T$/','/^W$/','/^R$/','/^F$/','/^S$/']
仅当字符串长度为一个字符时,才会产生匹配。
答案 1 :(得分:2)
使用strtr
:
$replacements = [
"U"=>"Sun",
"M"=>"Mon",
"T"=>"Tue",
"W"=>"Wed",
"R"=>"Thu",
"F"=>"Fri",
"S"=>"Sat"
];
$nice_day_name = strtr($input,$replacements);
答案 2 :(得分:2)
不要让问题比应该更难:
$day_names = array_combine(
['U','M','T','W','R','F','S'],
['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
);
$nice_day_name = $day_names[$input];
str_replace()
有同样的问题,我在my answer中将此问题覆盖到另一个问题。
答案 3 :(得分:0)
试试这个:
$string = 'U';
$trans = array("U" => "Sun", "M" => "Mon", "T" => "Tue", "W" => "Wed", "R" => "Thu",
"F" => "Fri", "S" => "Sat");
$result = strtr($string,$trans);
echo $result;