$val) { $ret[$key] = mb_str_replace($search, $replace, $val); } return $ret; } foreach ((array)$search as $key => $s) { if ($s == '') { continue; } $r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : ''); $pos = mb_strpos($subject, $s, 0, 'UTF-8'); while ($pos !== false) { $subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8'); $pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8'); } } return $subject; } class converter { private $mState; private $mConveters; private $mCurConveter; public function __construct() { $this->mState = 0; $this->mConveters = [new ccb(), new ccbb(), new bcm(), new spdb(), new cmbc(), new cmbcex(), new cmbc16(), new cmbc28(), new hfb()]; $this->clear(); } private function clear() { foreach ($this->mConveters as $item) { $item->clear(); } $this->mCurConveter = null; } public function start() { $this->mState = 0; $this->clear(); } public function end() { $this->mState = 0; $this->clear(); } public function convert($line) { if ($this->mState === 0) { if ($this->match($line)) { $this->mState = 1; } return []; } else { $ret = $this->mCurConveter->convert($line); return $ret; } } private function match($line) { foreach ($this->mConveters as $conveter) { if ($conveter->match($line)) { $this->mCurConveter = $conveter; return true; } } return false; } }