3v4l.org

run code in 300+ PHP versions simultaneously
<?php function mb_str_replace($search, $replace, $subject, $encoding = 'auto') { if(!is_array($search)) { $search = array($search); } if(!is_array($replace)) { $replace = array($replace); } if(strtolower($encoding) === 'auto') { $encoding = mb_internal_encoding(); } // $subject が複数ならば各要素に繰り返し適用する if(is_array($subject) || $subject instanceof Traversable) { $result = array(); foreach($subject as $key => $val) { $result[$key] = mb_str_replace($search, $replace, $val, $encoding); } return $result; } $currentpos = 0; // 現在の検索開始位置 while(true) { // $currentpos 以降で $search のいずれかが現れる位置を検索する $index = -1; // 見つけた文字列(最も前にあるもの)の $search の index $minpos = -1; // 見つけた文字列(最も前にあるもの)の位置 foreach($search as $key => $find) { if($find == '') { continue; } $findpos = mb_strpos($subject, $find, $currentpos, $encoding); if($findpos !== false) { if($minpos < 0 || $findpos < $minpos) { $minpos = $findpos; $index = $key; } } } // $search のいずれも見つからなければ終了 if($minpos < 0) { break; } // 置換実行 $r = array_key_exists($index, $replace) ? $replace[$index] : ''; $subject = mb_substr($subject, 0, $minpos, $encoding) . // 置換開始位置より前 $r . // 置換後文字列 mb_substr( // 置換終了位置より後ろ $subject, $minpos + mb_strlen($search[$index], $encoding), mb_strlen($subject, $encoding), $encoding); // 「現在位置」を $r の直後に設定 $currentpos = $minpos + mb_strlen($r, $encoding); } return $subject; } $test = 'this is {$tableName} test'; echo mb_str_replace('{$tableName}', 'timecard', $test);

preferences:
54.92 ms | 402 KiB | 5 Q