【问题标题】:When using preg_replace I get double characters...?当使用 preg_replace 我得到双字符...?
【发布时间】:2011-05-26 16:16:05
【问题描述】:

当我使用以下脚本时,我得到了双字符。为什么?

$clean_lastname = "Dür";
$clean_lastname = preg_replace("/[ùúûü]/", "u", $clean_lastname);
echo $clean_lastname;

输出:Duur

我希望它是Dur

我还是做错了什么...'在 preg 函数中放入一个数组的值是怎么回事?

$clean_lastname = "Boerée";
$l = 0;
$pattern = array('[ÀÁÂÃÄÅ]','[Ç]','[ÈÉÊË]','[ÌÍÎÏ]','[Ñ]','[ÒÓÔÕÖØ]','[Ý]','[ß]','[àáâãäå]','[ç]','[èéêë]','[ìíîï]','[ñ]','[òóôõöø]','[ùúûü]','[ýÿ]');
$replace = array(A,C,E,I,N,O,Y,S,a,c,e,i,n,o,u,y);

foreach ($pattern as $wierdchar)
{
    $clean_lastname = preg_replace('/$wierdchar/u', '$replace[$l]', $clean_lastname);
    $l++;
}

//$clean_lastname = preg_replace('/[èéêë]/u', 'e', $clean_lastname);

//$clean_lastname = strtr($clean_lastname, "ùúûü","uuuu");
echo $clean_lastname;

【问题讨论】:

    标签: php string preg-replace


    【解决方案1】:
    <?php
        $vowels = array("ù","ú","û","ü" );
        $consonents = array("u","u","u","u");
        $clean_lastname = "Dür";
        echo str_replace( $vowels, $consonents, $clean_lastname);
    ?>
    

    【讨论】:

      【解决方案2】:
      $clean_lastname = str_replace(array('ù', 'ú', 'û', 'ü', 'Ù', 'Ú', 'Û', 'Ü'), array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'), $clean_lastname);
      

      // 或解决您最初的问题:

      $clean_lastname = preg_replace('/[ùúûü]/u', 'u', $clean_lastname);
      

      【讨论】:

      • 我解决了!!我需要带有 u 修饰符的 preg_replace !!谢谢你!很多!我真的迷路了!
      【解决方案3】:

      坚持原来的strtr

      $clean_lastname = "Dür Dùr Dúr Dûr";
      $clean_lastname = strtr($clean_lastname, "ùúûü", "uuuu");
      echo $clean_lastname;
      

      【讨论】:

        【解决方案4】:

        我能想象到的唯一情况是当您的两个字符串(输入字符串和模式)具有不同的字符编码或者都是 UTF-8 但您没有正确指定它时。

        因为在后一种情况下,"Dür" 等价于"D\xC3\xBCr"ü 用两个字节序列 0xC3BC 进行编码)并且模式"/[ùúûü]/" 等价于"/[\xC3\xB9\xC3\xBA\xC3\xBB\xC3\xBC]/"。由于转义序列\xHH 指定的每个字节都被视为单个字符,因此会产生以下结果:

        echo preg_replace("/[\xC3\xB9\xC3\xBA\xC3\xBB\xC3\xBC]/", "u", "D\xC3\xBCr");  // Duur
        

        因此,在使用 UTF-8 时,请务必设置 u modifier flag,以便将模式和输入字符串视为 UTF-8 编码:

        "/[ùúûü]/u"
        

        编辑    既然你已经阐明了你的意图并且你似乎试图实现某种transliteration,你应该看看iconv它的音译能力:

        iconv("UTF-8", "US-ASCII//TRANSLIT", $str)
        

        另请参阅其他相关主题,例如:

        【讨论】:

        • 我到了那里......所以如果我是对的......:我应该在 strtr 函数中输入正确的 UTF-8 编码字符......然后它会工作吗?
        • @Thijs:不,您实际上只需要在模式中使用 u 修饰符即可将模式和主题字符串视为 UTF-8 编码。不,strtr 是单字节字符串函数,但 UTF-8 是多字节字符串编码。您不应该将单字节字符串函数与多字节字符串编码一起使用。
        • 我该怎么做?我真的迷路了,我在我的 php 程序中得到了完全相同的字符,但它一直不工作...... :(
        • @Thijs:你确定你使用的是 UTF-8 吗?
        猜你喜欢
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多