使用strtr转换特殊字符的麻烦

时间:2014-03-31 09:17:51

标签: php

$string = strtr($string,
"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ", 
"aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr");

所以我有以下代码行将特殊字符转换为普通字符。但是,它并没有像我们那样将字符归还给我。

例如:

Thïs is á tëst

返回:

thrs-is-r-trst

似乎每个特殊字符都只是作为列表中的最后一个字母返回。

完整的代码段:

$string = strtr($_POST['title'], 
"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ", 
"aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr");

$string = trim($string);

$string = str_replace (" ", "-", $string);

$string = preg_replace('/[^a-zA-Z0-9-]/', '', $string);

$string = strtolower($string);

1 个答案:

答案 0 :(得分:0)

来自TFM

  

如果给出三个参数,则此函数返回str的副本,其中from中每个 (单字节)字符的所有出现 已被翻译为to中的相应字符,即$from[$n]的每一次出现都已替换为$to[$n],其中$n是两个参数中的有效偏移量。

strtr将输入字符串视为单字节字符。但是你几乎肯定会将它们编码为多字节字符,因此它们没有被正确解析。您应该使用strtr的第二种形式:

  

如果给出两个参数,则第二个应该是array('from' => 'to', ...)形式的数组。返回值是一个字符串,其中所有出现的数组键都已被相应的值替换。将首先尝试最长的密钥。替换子字符串后,将不再搜索其新值。

$string = strtr($_POST['title'], array('À' => 'a', 'Á' => 'a', ...));

这应该正确处理多字节字符串。