str_ireplace 相当于 str_replace

str_ireplace works as str_replace

我需要将 url 字符串中的所有本地字符(包括大写字母)替换为小的 ascii 字符。

$str = "č-ć-đ-š-ž-Č-Ć-Đ-Š-Ž";
echo str_ireplace(array('č', 'ć', 'đ', 'š', 'ž'), array('c', 'c', 'd', 's', 'z'), $str);

结果 - c-c-d-s-z-Č-Ć-Đ-Š-Ž
我预计 - c-c-d-s-z-c-c-d-s-z

如何使用 str_ireplace() 函数获得预期结果。

您混淆了大小写字符。 Čč 的 Unicode 不同,因此它们不相同。

尝试以下操作:

<?php
    $str = "č-ć-đ-š-ž-Č-Ć-Đ-Š-Ž";
    echo str_ireplace(array('č', 'ć', 'đ', 'š', 'ž', 'Č', 'Ć', 'Đ', 'Š', 'Ž'), array('c', 'c', 'd', 's', 'z', 'c', 'c', 'd', 's', 'z' ), $str);
?>

大多数 PHP string functions 将字符串作为字节序列处理,即单字节字符 (ASCII)。

您想替换包含多字节字符的字符串中的字符。 str_replace() (有点)有效,因为它不关心将字符串解释为字符。它用另一个字节序列替换一个字节序列,仅此而已。大多数情况下,它在使用 ASCII 甚至 UTF-8 编码字符串时不会破坏任何东西(因为 UTF-8 的设计方式)。但是,使用其他编码可能会产生意想不到的结果。

当要求处理 ASCII 范围外的字符时,[str_ireplace()](http://php.net/manual/en/function.str-ireplace.php) works the same asstr_replace()`。它的 "case insensitive" 功能需要将字符串拆分为字符并识别小写-大写对。但由于它不处理多字节字符,因此无法识别代码大于 127 的任何字符。

对于多字节字符串,您应该使用 Multibyte String PHP 扩展提供的函数。

它为字符串替换提供的唯一功能是 mb_ereg_replace() (with the case-insensitive version mb_eregi_replace()) 但它们对您的帮助不大(因为它们不适用于数组)。

如果要替换的字符列表是固定的,我的建议是使用 str_replace() 和包含两种情况的字符列表:

$str = "č-ć-đ-š-ž-Č-Ć-Đ-Š-Ž";
echo str_replace(
         array('č', 'ć', 'đ', 'š', 'ž', 'Č', 'Ć', 'Đ', 'Š', 'Ž'), 
         array('c', 'c', 'd', 's', 'z', 'c', 'c', 'd', 's', 'z'),
         $str
     );

您可以先将它们转为小写,

$str = "č-ć-đ-š-ž-Č-Ć-Đ-Š-Ž";
echo str_ireplace(array('č', 'ć', 'đ', 'š', 'ž'), array('c', 'c', 'd', 's', 'z'), mb_strtolower($str, "UTF-8"));