2017-06-19 49 views
1

我需要用url字符串中的小ascii字符替换所有本地字符(包括大写)。str_ireplace作为str_replace工作

$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()函数预期的结果。

+0

可能重复[如何在PHP中替换字符串中的非ASCII字符?](https://stackoverflow.com/questions/25236761/how-to-replace-non-ascii-characters-in-a -string-in-php) – Marten

+3

@Marten,它不重复。我的问题特别是关于'str_ireplace'函数。 – bonaca

回答

1

大多数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 as str_replace()`。它的“不区分大小写”功能要求将字符串拆分为字符并识别小写字母 - 大写字母对。但由于它不处理多字节字符,因此无法识别代码大于127的任何字符。

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

它提供的字符串替换函数的唯一功能是mb_ereg_replace()(不区分大小写的版本mb_eregi_replace()),但它们对你没有太大帮助(因为它们不适用于数组)。

如果要替换的字符的列表是固定的,我的建议是使用str_replace()与人物的名单,其中包括两种情况:

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

非常感谢您的详细解释。 – bonaca

1

您正在混合使用大写和小写字符。 Čč有不同的Unicode,所以它们不一样。

尝试以下方法:

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

*“'Č'具有与'č'不同的ASCII码,因此它们不是相同的”* - 当然它们具有不同的代码并且它们不相同(但它们不属于ASCII代码) 。这是'str_ireplace()'的要点,用于查找和替换两个字符,但由于完全不同的原因而失败。 – axiac

+0

的确是正确的,我应该是Unicode字符而不是ASCII。 –

1

您可以跨他们降低的情况下第一,

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

该解决方案解决了手头的问题,但有副作用:它会降低整个琴弦的音量,可能这不是我们所期望的。 (很可能是希望的,但在问题中没有明确说明)。 – axiac