Php 使用数组时,preg_replace应该是迭代的吗?可能是个虫子

Php 使用数组时,preg_replace应该是迭代的吗?可能是个虫子,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个字符串,表示一周中的某一天“U”、“M”、“T”等。我试图使用preg_replace将字母替换为实际的日期名称,如星期日、星期一等 然而,它似乎是在以迭代的方式应用替换数组,而这并不是 $input = "U"; $nice_day_name = preg_replace(['/U/','/M/','/T/','/W/','/R/','/F/','/S/'], ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'], $input); //

我有一个字符串,表示一周中的某一天“U”、“M”、“T”等。我试图使用preg_replace将字母替换为实际的日期名称,如星期日、星期一等

然而,它似乎是在以迭代的方式应用替换数组,而这并不是

$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"
似乎模棱两可。下面是关于这个主题的内容:

如果
模式
替换
参数都是数组,则每个
模式
都将被对应的
替换
替换

看起来您将此理解为“将针对数组中的每个模式检查原始字符串,并进行替换”。我可以看到人们是如何以这种方式读取它的。它似乎是在根据字符串检查每个模式,包括已进行的任何替换

所以它是这样做的:

  • 检查第一个模式,
    /U/
    ,找到匹配项,进行替换-->
    Sun
  • 再检查一堆,找不到匹配的
  • 检查最后一个字符,
    /S/
    ,找到匹配项(第一个字符),进行替换-->
    Satun
  • 要解决此问题,可以在每个模式中包含开始/结束字符:

    ['/^U$/','/^M$/','/^T$/','/^W$/','/^R$/','/^F$/','/^S$/']
    

    仅当字符串长度为一个字符时,这将导致匹配。

    此任务最好使用以下方法完成:


    不要让问题变得更难:

    $day_names = array_combine(
        ['U','M','T','W','R','F','S'],
        ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
    );
    
    $nice_day_name = $day_names[$input];
    
    有同样的问题,我用另一个问题来回答


    试试这个:

    $string = 'U';
    $trans = array("U" => "Sun", "M" => "Mon", "T" => "Tue", "W" => "Wed", "R" => "Thu",
     "F" => "Fri", "S" => "Sat");
    $result = strtr($string,$trans);
    echo $result;
    

    为什么您需要
    preg\u replace()
    来执行此操作?您只是在搜索已知字符串,所以
    str\u replace()
    应该可以正常工作。或者,如果您总是使用单字符输入,为什么不指定一个关联数组来映射替换?一个明显的解决方法是,通过更改
    /T(?ue | hu)的
    /T/
    来防止替换已替换的文本部分/
    ,例如。至于处理顺序-好吧,在不产生潜在冲突的情况下,您还希望得到什么?如果主题是数组,则对subject@MikeBrant:不,.@raina77ow负面表情的开头一点也不明显:p“Quote”比“Code”更适合使用“用于引用文件;”为你编辑的。嗯-把降价再提高一点-在那里!。。。这太有效了XD我没有注意到输入仅仅是一个字符+1请注意:这是Niet提出的。哦,是的,事实上,当我开始打字时,它不可用,然后我测试并发布它,这花了一点时间。。
    $string = 'U';
    $trans = array("U" => "Sun", "M" => "Mon", "T" => "Tue", "W" => "Wed", "R" => "Thu",
     "F" => "Fri", "S" => "Sat");
    $result = strtr($string,$trans);
    echo $result;