[英]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"
該文檔似乎模棱兩可。 這是該主題的內容:
如果
pattern
和replacement
參數均為數組,則每個pattern
將由replacement
副本replacement
。
看來您正在讀這是因為“將檢查數組中每個模式的原始字符串,並將進行替換”。 我可以看到人們會怎么看。 相反,它似乎正在針對字符串檢查每個模式, 包括已經進行的替換 。
因此,它正在這樣做:
/U/
,找到一個匹配項,進行替換-> Sun
/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.