我试图从字符串中删除重音符号,并在php中编写了以下函数,但没有删除它们。字符串进入时带有重音,返回时带有重音。
function stripaccents($string)
{
$replace = array('é','í','ó','á','ñ', 'ú', 'ü');
$with = array('e','i','o','a', 'n', 'u', 'u');
foreach ($replace as &$char)
{
$char = utf8_decode($char);
}
unset($char);
$newstring = str_replace($replace, $with, $string);
return $newstring;
}
如果您使用的是PHP 5.3或更高版本(您应该使用),请使用内置函数:
$newstring = normalizer_normalize($oldstring);
您也可以使用iconv
$newstring = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
由于您要在specific中查找西班牙语字符,因此可以使用正则表达式来查找这些特定字符:
function stripaccents($string)
{
$replace = array('/é/','/í/','/ó/','/á/','/ñ/', '/ú/', '/ü/');
$with = array('e','i','o','a', 'n', 'u', 'u');
$newstring = preg_replace($replace, $with, $string);
return $newstring;
}
否则,您可以使用前面提到的其他函数之一。
我认为您不需要
foreach ($replace as &$char)
{
$char = utf8_decode($char);
}
unset($char);
因为utf8_decode试图将2字节值从$replace转换为1字节值
这是我正在使用的一个自定义。
function remove_accents($str, $charset = 'utf-8') {
$str = htmlentities($str, ENT_NOQUOTES, $charset);
$str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', ''1', $str);
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', ''1', $str);
$str = preg_replace('#&[^;]+;#', '', $str);
return $str;
}
我在PHP中找到的最好的方法,你当然可以自定义它:
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Upper(); :: NFC;', Transliterator::FORWARD);
return $transliterator->transliterate('çÇ æ λώπηξ-É&-è_çà=@146/,*');
Output: "CC AE LOPEX-E&-E_CA=@146/,*"
来源:https://www.php.net/manual/en/class.transliterator.php