簡體   English   中英

使用數組時,preg_replace應該是迭代的嗎? 可能是個錯誤

[英]Is preg_replace supposed to be iterative when using arrays? Might be a bug

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

該文檔似乎模棱兩可。 這是該主題的內容:

如果patternreplacement參數均為數組,則每個pattern將由replacement副本replacement

看來您正在讀這是因為“將檢查數組中每個模式的原始字符串,並將進行替換”。 我可以看到人們會怎么看。 相反,它似乎正在針對字符串檢查每個模式, 包括已經進行的替換

因此,它正在這樣做:

  1. 檢查第一個模式/U/ ,找到一個匹配項,進行替換-> Sun
  2. 再檢查一堆,找不到匹配項
  3. 檢查最后一個/S/ ,找到一個匹配項(第一個字符),進行替換-> Satun

要解決此問題,您可以在每個模式中包括開始/結束字符:

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

僅當字符串長度為一個字符時,這才導致匹配。

使用strtr可以更好地完成此任務:

$replacements = [
    "U"=>"Sun",
    "M"=>"Mon",
    "T"=>"Tue",
    "W"=>"Wed",
    "R"=>"Thu",
    "F"=>"Fri",
    "S"=>"Sat"
];
$nice_day_name = strtr($input,$replacements);

不要讓問題變得更難解決:

$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()具有相同的問題,我在回答其他問題時對此進行了介紹。

現場演示

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM