使用数组时preg_replace应该是迭代的吗?可能是一个bug

时间:2014-03-31 17:48:01

标签: php regex preg-replace

我有一个代表星期几的字符串" 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"

4 个答案:

答案 0 :(得分:3)

The documentation似乎含糊不清。以下是关于这个主题的内容:

  

如果patternreplacement参数都是数组,则每个pattern都将被replacement对应项替换。

看起来您正在阅读这个" 原始字符串将针对数组中的每个模式进行检查,并且将进行替换"。我可以看到一个人会怎样读它。它似乎正在做的是根据字符串检查每个模式,包括已经进行的任何替换

所以它这样做:

  1. 检查第一个模式/U/,找到匹配项,进行替换 - > Sun
  2. 查看更多内容,找不到匹配
  3. 检查最后一个,/S/,找到匹配项(第一个字符),进行替换 - > Satun
  4. 要解决此问题,您可以在每个模式中包含开始/结束字符:

    ['/^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中将此问题覆盖到另一个问题。

Live demo

答案 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;