diff options
Diffstat (limited to 'include/utf8/str_ireplace.php')
-rw-r--r-- | include/utf8/str_ireplace.php | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/include/utf8/str_ireplace.php b/include/utf8/str_ireplace.php new file mode 100644 index 0000000..7257b0a --- /dev/null +++ b/include/utf8/str_ireplace.php @@ -0,0 +1,72 @@ +<?php + +/** +* @version $Id: str_ireplace.php,v 1.2 2007/08/12 01:20:46 harryf Exp $ +* @package utf8 +* @subpackage strings +*/ + +/** +* UTF-8 aware alternative to str_ireplace +* Case-insensitive version of str_replace +* Note: requires utf8_strtolower +* Note: it's not fast and gets slower if $search / $replace is array +* Notes: it's based on the assumption that the lower and uppercase +* versions of a UTF-8 character will have the same length in bytes +* which is currently true given the hash table to strtolower +* @param string +* @return string +* @see http://www.php.net/str_ireplace +* @see utf8_strtolower +* @package utf8 +* @subpackage strings +*/ +function utf8_ireplace($search, $replace, $str, $count=null) +{ + if (!is_array($search)) + { + $slen = strlen($search); + + if ($slen == 0) + return $str; + + $lendif = strlen($replace) - strlen($search); + $search = utf8_strtolower($search); + + $search = preg_quote($search); + $lstr = utf8_strtolower($str); + $i = 0; + $matched = 0; + + while (preg_match('/(.*)'.$search.'/Us', $lstr, $matches)) + { + if ($i === $count) + break; + + $mlen = strlen($matches[0]); + $lstr = substr($lstr, $mlen); + $str = substr_replace($str, $replace, $matched+strlen($matches[1]), $slen); + $matched += $mlen + $lendif; + $i++; + } + + return $str; + } + else + { + foreach (array_keys($search) as $k) + { + if (is_array($replace)) + { + if (array_key_exists($k, $replace)) + $str = utf8_ireplace($search[$k], $replace[$k], $str, $count); + else + $str = utf8_ireplace($search[$k], '', $str, $count); + } + else + $str = utf8_ireplace($search[$k], $replace, $str, $count); + } + + return $str; + } +} |